云计算虚拟化技术与开发
上QQ阅读APP看书,第一时间看更新

2.3.2 IOMMU

输入/输出内存管理单元(IOMMU)是一个内存管理单元,管理对系统内存设备的访问。它位于外围设备和主机之间,可以把DMA I/O总线连接到主内存上,将来自设备请求的地址转换为系统内存地址,并检查每个接入的适当权限。IOMMU技术示意图如图2-14所示。

图2-14 IOMMU技术示意图

AMD公司的IOMMU提供DMA地址转换以及对设备读取和写入权限检查的功能。通过IOMMU,客户机操作系统中一个未经修改的驱动程序可以直接访问它的目标设备,从而避免了通过VMM运行产生的开销以及设备模拟。

有了IOMMU,每个设备可以分配一个保护域。这个保护域定义了I/O页的转译将被用于域中的每个设备,并且指明每个I/O页的读取权限。对于虚拟化而言,VMM可以指定所有设备分配到相同保护域中的一个特定客户机操作系统,这将创建一系列在客户机操作系统中运行所有设备需要使用的地址转译和访问限制。

IOMMU将页转译缓存在一个TLB中,当需要进入TLB时需要输入保护域和设备请求地址。因为保护域是缓存密钥的一部分,所以域中的所有设备共享TLB中的缓存地址。

IOMMU决定一台设备属于哪个保护域,然后使用这个域和设备请求地址查看TLB。TLB入口中包括读/写权限标记以及用于转译的目标系统地址,因此,如果缓存中出现一个登入动作,会根据许可标记来决定是否允许该访问。

对于不在缓存中的地址而言,IOMMU会继续查看设备相关的I/O页表格。而I/O页表格入口也包括连接到系统地址的许可信息。

因此,所有地址转译最重要的是TLB或者页表是否能够被成功查看,如果查看成功,适当的权限标记会告诉IOMMU是否允许访问。然后,VMM通过控制IOMMU用来查看地址的I/O页表格,以控制系统页对设备的可见性,并明确指定每个域中每个页的读/写访问权限。

IOMMU提供的转译和保护双重功能提供了一种完全从用户代码、无须内核模式驱动程序操作设备的方式。IOMMU可以被用于限制用户流程分配的内存设备DMA,而不是使用可靠驱动程序控制对系统内存的访问。设备内存访问仍然是受特权代码保护的,但它是创建I/O页表格的特权代码。

IOMMU通过允许VMM直接将真实设备分配到客户机操作系统让I/O虚拟化更有效。有了IOMMU,VMM会创建I/O页表格将系统物理地址映射到客户机物理地址,为客户机操作系统创建一个保护域,然后让客户机操作系统正常运转。针对真实设备编写的驱动程序则作为那些未经修改、对底层转译无感知的客户机操作系统的一部分而运行。客户I/O交易通过IOMMU的I/O映射从其他客户独立出来。

总而言之,AMD的IOMMU避免设备模拟,取消转译层,允许本机驱动程序直接配合设备,极大地降低了I/O设备虚拟化的开销。