IOMMU
IOMMU是指I/O设备的MMU(Memory Management Unit),如图5-22所示。在虚拟化环境下使用IOMMU,就可以直接从客户端操作系统发出I/O命令。
图 5-22 IOMMU的运行
在Xen/KVM等虚拟化环境下,客户端操作系统无法识别主机物理内存地址。客户端操作系统识别通过管理程序虚拟化的客户端物理地址来运行。因此PCI设备的DMA传输就需要将客户端物理内存地址转换为主机物理内存地址的结构。
IOMMU就是用来进行这个转换的硬件结构。客户端操作系统在PCI设备的寄存器中设置客户端物理内存地址,并向设备请求进行DMA传输。而设备则向所设置的物理内存地址写入数据,但将这个客户端物理内存地址转换为主机物理内存地址的任务是由IOMMU来承担的。
从客户端物理内存地址转换为主机物理内存地址时,管理程序必须事先在IOMMU中设置每个PCI设备的页表。在这个页表中,将使PCI设备的客户端操作系统的客户端物理内存地址和主机物理内存地址进行对应。
通过这样的方式使用IOMMU,就可以不经由主机操作系统或管理程序,在客户端操作系统和I/O设备之间进行DMA数据传输,因此将使用IOMMU的方式称为直接I/O方式。另外,使用IOMMU时,所分配的设备只能从该客户端操作系统进行操作。PCI设备的控制直接被传递到客户端操作系统,因此也称为PCI传递(pass through)方式。