QEMU Arm 如何通过 PCI 卡?

lim*_*ala 1 linux pci virtual-machine qemu

我正在尝试访问 QEMU 上的 PCI WiFi 适配器,模拟 vexpress-a9 板。

我正在关注教程,教程将主机的直通 PCI 卡共享给在 qemu-kvm 上运行的来宾机器。但我认为它不适用于 qemu-system-arm。

  • 是否可以使用 qemu-system-arm 为 vexpress-a9 传递 PCI?
  • 有没有办法在来宾操作系统中将 PCI 卡作为 USB 设备访问?或来宾操作系统中的主机 USB 设备?

这是我在做什么:

$ qemu-system-arm \
-kernel ./zImage \
-M vexpress-a9 \
-cpu cortex-a9 \
-m 1024 \
-smp 2 \
-serial stdio \
-append "root=/dev/mmcblk0p1 rootfstype=ext4 rw raid=noautodetect console=ttyAMA0,38400n8 rootwait devtmpfs.mount=0 vmalloc=256MB mem=1024M" \
-sd ./vexpress-quantal.img
Run Code Online (Sandbox Code Playgroud)

slm*_*slm 5

确保您完成了本节13.3.4 中概述的步骤文档中的PCI Pass-Through,标题为:第 13 章。使用 qemu-kvm 运行虚拟机

摘抄

程序 13.1。配置 PCI 直通

  1. 确保在主机的运行内核中设置了 CONFIG_DMAR_DEFAULT_ON:

    $ grep CONFIG_DMAR_DEFAULT_ON /boot/config-`uname -r`
    
    Run Code Online (Sandbox Code Playgroud)

    如果未设置此选项,请编辑引导加载程序配置并添加 intel_iommu=on(Intel 机器)或 iommu=pt iommu=1(AMD 机器)。然后重启主机。

  2. 检查 IOMMU 是否已在主机上主动启用和识别。运行 dmesg | 英特尔机器上的 grep -e DMAR -e IOMMU 或 dmesg | grep AMD-Vi 在 AMD 机器上。如果没有输出,请仔细检查您的硬件是否支持 IOMMU (VT-d) 并检查它是否已在 BIOS 中启用。

  3. 标识要分配给来宾的主机 PCI 设备。

    tux@vmhost:~> lspci -nn
    [...] 00:1b.0 Audio device [0403]: Intel Corporation 82801H (ICH8 Family) \
    HD Audio Controller [8086:284b] (rev 02) [...]
    Note down the device (00:1b.0) and vendor (8086:284b) ID.
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从主机内核驱动程序解除设备绑定并将其绑定到 PCI 存根驱动程序。

    tux@vmhost:~> modprobe pci_stub
    tux@vmhost:~> echo "8086 284b" > /sys/bus/pci/drivers/pci-stub/new_id
    tux@vmhost:~> echo "0000:00:1b.0" > /sys/bus/pci/devices/0000:00:1b.0/driver/unbind
    tux@vmhost:~> echo "0000:00:1b.0" > /sys/bus/pci/drivers/pci-stub/bind
    
    Run Code Online (Sandbox Code Playgroud)
  5. 现在运行分配了 PCI 设备的 VM 来宾。

    qemu-kvm [...] -device pci-assign,host=00:1b.0
    
    Run Code Online (Sandbox Code Playgroud)

QEMU/KVM ARM 支持

根据 1.5 和 1.6 版的变更日志,ARM 支持以下方式:

1.5

  • 此版本最初支持 KVM 的 ARM 架构。这需要 3.9 或更好的 Linux 内核和 Cortex-A15 CPU。
  • Zynq 板提供 SD 主机控制器接口。
  • VersatilePB 和 Realview 板卡的 PCI 控制器模型在功能上得到了显着改进(包括 MMIO BAR 支持和正确的 PCI IRQ 映射)。请注意,Linux 内核目前没有利用这一点;但是,我们会自动检测那些期望旧的损坏 QEMU 的行为的内核,然后回退到该行为。(如果绝对必要,可以使用“-global allowed_pci.broken-irq-mapping=1”强制旧的 IRQ 行为。)
  • 已修复 Thumb 模式下 SRS 指令的错误处理。
  • ARM 目标的 TCG 仿真的性能比以前的版本有所提高。
  • 迁移和 vm 保存/加载现在可以在 vexpress-a15 和 vexpress-a9 模型上正常工作。

1.6

  • 支持用于加载-获取/存储-释放的 32 位 ARMv8 LDA/STL 指令(仅适用于 -cpu any);新的 v8 指令的其余部分将在未来版本中提供。
  • vexpress-a9 和 vexpress-a15 板通过 virtio-mmio 传输为 virtio 设备提供实验支持。请注意,用于 x86 系统的 virtio 命令行将无法使用,因为它们会创建 PCI virtio 设备;改用设备“virtio-blk-device”、“virtio-net-device”等。请注意,此功能可能会在未来版本中更改。
  • -initrd 选项现在接受带有 U-Boot 标头的 ramdisk。
  • 现在支持 Calxeda ECX-2000 / Midway 系统的模型(“midway”)。