1 描述

        通常存在一个全局开关来enable/disable vIOMMU。系统中所有的设备仅能通过vIOMMU或全部不通过,这样使使用非常不灵活。我们介绍bypass iommu属性来让设备可以通过也可以不通过vIOMMU。这对于在相同虚拟机上使用no-iommu模式的passthrough设备和通过vIOMMU的设备非常有用。

        PCI host bridge也有一个bypass_iommu属性。该属性用于决定联结到PCI host bridge的设备是否bypass虚拟IOMMU。仅当系统中存在虚拟IOMMU时bypass属性才有效。它允许一些设备可以bypass vIOMMU。当host bridge的bypass_iommu属性没有设置时,连接的设备默认通过vIOMMU。

2 使用

        bypass iommu特性支持PXB host bridge和默认主main host bridge,我们为PXB增加bypass_iommu属性,为机器增加default_bus_bypass_iommu属性。注意default_bus_bypass_iommu属性仅当X86架构上的q35机器类型和AArch64上的virt机器类型时有效。其他机器类型默认不支持bypass iommu。

2.1 下列为bypass iommu选项:

(1)PCI expander bridge

qemu -device pxb-pcie,bus_nr=0x10,addr=0x1,bypass_iommu=true

(2)Arm default host bridge

qemu -machine virt,iommu=smmuv3,default_bus_bypass_iommu=true

(3)X86默认root总线bypass iommu

qemu -machine q35,default_bus_bypass_iommu=true

2.2 这里AArch64的virt机器有更详细的qemu命令行:

qemu-system-aarch64 \
 -machine virt,kernel_irqchip=on,iommu=smmuv3,default_bus_bypass_iommu=true \
 -device pxb-pcie,bus_nr=0x10,id=pci.10,bus=pcie.0,addr=0x3.0x1 \
 -device pxb-pcie,bus_nr=0x20,id=pci.20,bus=pcie.0,addr=0x3.0x2,bypass_iommu=true \

这里:

- 一个默认的host bridge,它bypass SMMUv3

- 一个pxb host bridge,它通过SMMUv3

- 一个pxb host bridge,它bypass SMMUv3

2.3 这里X84的q35机器有更详细的qemu命令行:

qemu-system-x86_64 \
 -machine q35,accel=kvm,default_bus_bypass_iommu=true \
 -device pxb-pcie,bus_nr=0x10,id=pci.10,bus=pcie.0,addr=0x3 \
 -device pxb-pcie,bus_nr=0x20,id=pci.20,bus=pcie.0,addr=0x4,bypass_iommu=true \
 -device intel-iommu \

 这里

- 一个默认的host bridge,它bypass iommu

- 一个pxb host bridge,它通过iommu

- 一个pxb host bridge,它bypass iommu

3 限制

        当设备bypass iommu时可能存在潜在安全风险,因为如果没有iommu的隔离,设备可能发送malicious DMA。因此仅对可信任的设备bypass iommu。

4 实现

        bypass iommu特性包含:

- 地址空间:对PCI host增加bypass iommu属性判断,对bypass iommu的设备不会获得iommu地址空间;

- Arm SMMUv3支持:我们遍历所有PCI root总线并获得总线号范围,然后对不bypass iommu的设备建立明确的RID映射;

- X86 IOMMU支持: 为支持INTEL iommu,我们遍历所有PCI host bridge并从不bypass iommu的设备获得设备信息,然后填充DMAR drhd结构用明确的设备范围信息。为支持AMD iommu,在遍历PCI host bridge时增加bypass iommu判断;

- 机器和PXB选项: 我们对于PXB的默认root选项增加bypass iommu选项。注意bypass iommu的默认值为false,因此设备默认会通过iommu。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐