对于英特尔的硬件辅助虚拟化解决方案,两种核心技术是VT-x和VT-d。其中,VT-x主要引入了非root模式(VMCS)和EPT页表等技术,主要侧重于vCPU虚拟化和内存虚拟化。 VT-d的引入侧重于设备直通(即IO虚拟化)。在VT-x中,在非根模式下,MMU直接使用EPT页表来完成GPA-> HVA-> HPA的两级转换。在VT-d中,在非根模式下,IOMMU使用上下文表和IOMMU页表在设备DMA请求过程中完成HPA-> HVA-> GPA的转换。两者非常相似,唯一的区别是CPU通过MMU访问内存(通过设备IO内存)以查找EPT页表以完成地址转换,而通过设备访问内存请求是通过IOMMU查找IOMMU页表以完成地址转换。本文重点探讨英特尔IOMMU的工作机制。硬件结构首先查看下一个典型的X86物理服务器视图:我们可以在多通道服务器上拥有多个DMAR单元(这里可以直接理解为多个IOMMU硬件),每个DMAR将负责处理设备的DMA。安装在其下请求地址翻译。例如,在上图中,安装在PCIE根端口(dev:fun)(14:0)下的所有设备的DMA请求由DMAR#1处理,并安装在PCIE根端口(dev:fun)(14: 1)DMAR#2负责处理DMAR#3下所有设备的所有DMA请求,并且Root-Complex集成设备[29:0]安装在DMAR#3下。在DMAR#4的情况下,此设备的DMA请求由DMAR#3收缩。更复杂的是,它负责处理Root-Complex集成设备[30:0]和I / OxAPIC设备的DMA请求。 BIOS需要通过ACPI表将与IOMMU相关的硬件拓扑信息提供给OS,以便OS能够驱动IOMMU硬件正常工作。关于硬件拓扑信息的呈现,有几个概念需要理解:DRHD:DMA重映射硬件单元定义用于描述DMAR单元(IOMMU)的基本信息RMRR:保留内存区域报告用于描述那些保留的信息物理地址,本节地址空间未重新映射。 ATSR:根端口ATS功能仅限于Device-TLB。根端口需要向操作系统报告支持ATS的能力。 RHSA:重映射硬件静态亲和力重映射亲和力,可以在NUMA系统下提高DMA重映射性能BIOS在ACPI表中提供了一组DMA重映射报告结构信息,以表示物理服务器上的IOMMU拓扑信息,因此OS知道如何在加载IOMMU驱动程序时建立映射关系。附件:我们可以使用一些工具来转储ACPI表的相关信息以查看数据结构。英特尔IOMMU驱动程序的关键数据结构可以描述为(单击链接以查看原始图像):根据自上而下的视图,第一个是IOMMU硬件级别。struct dmar_drhd_unit数据结构描述了IOMMU驱动程序的IOMMU硬件。系统BIOS透视图:该列表用于将所有DRHD串入链接列表中,以便于维护acpi_dmar_head * hdr指向IOMMU设备的ACPI表信息device_cnt表示由IOMMU管理的设备的当前数目include_all表示IOMMU是否管理所有平台上的设备(单个IOMMU的物理物理服务器)reg_base_addr表示IOMMU的寄存器基址intel_iommu * iommu指针指向struct intel_iommu数据结构struct intel_iommu进一步描述了IOMMU上限和ecap的所有相关信息以记录IOMMU硬件功能和扩展功能信息root_entry指向此IO的根条目表ir_table MMU,指向IOMMU(中断重映射表)结构的中断重映射表。iommu_device iommu从Linux设备驱动程序的角度描述了此IOMMU,并用于绑定sysfsstruct dmar_domain *** domains。更重要的是,它记录了所有dmar_domain信息管理在这个IOMMU之下。在虚拟化方案中,可以将多个设备直接连接到同一虚拟机。他们共享一个IOMMU页表。此映射关系通过DMAR域表示。也就是说,可以将多个直通设备添加到DMAR域,并且它们使用同一组页表来完成地址DMA请求的地址转换。然后,我们来看一下DMAR域:struct dmar_domain数据结构用于描述DMAR域的映射关系。 struct list_head设备链接列表记录了该域中的所有设备。