接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(4)
13.1 IOMMU
13.1.3 AMD处理器的IOMMU
AMD处理器的IOMMU技术与Intel的VT-d技术类似,其完成的主要功能也类似。AMD率先提出了IOMMU的概念,并发布了IOMMU的技术手册,但是Intel首先将这一技术在芯片中实现。由于AMD与Intel使用的x86体系结构略有不同,因此AMD的IOMMU技术在细节上与Intel的VT-d并不完全一致。
AMD处理器使用HT(Hyper Transport)总线连接I/O Hub,其中每一个I/O Hub都含有一个IOMMU,其结构如图13-5所示:
其中每一个IOMMU都使用一个Device Table。AMD处理器使用Device Table存放图13-3中的结构。
Device Table最多由2^16个Entry组成,其中每个Entry的大小为256b(bit)。因此,Device Table最大将占用2MB的内存空间(2^16 * 256 / 8 = 2^21 = 2M),与Intel使用的Root/Context Entry结构相比,AMD使用的这种方法容易造成内存的浪费。
I/O Hub中的设备(其中PCI设备使用Bus Number、Device Number和Function Number组成16位的Device ID,而HT设备使用HT Bus Number和Unit ID组成16位的Device ID)使用16位的Device ID在Device Table查找和该设备所对应的Entry,并使用这个Entry。根据I/O Page Table结构最终找到IO PTE表,并完成GPA到HPA的转换。在AMD处理器中,GPA到HPA的转换与图13-4中所示的方法有类似之处,但实现细节不同。
IOMMU使用一个新型的页表结构完成GPA到HPA的转换,该页表结构基于AMD64使用的虚拟地址到物理地址的页表结构,但是做出了一些改动。AMD64进行虚拟地址到物理地址的转换时使用4级页表结构,如图13-6所示:
与Intel处理器的结构类似,一个进程首先从CR3寄存器中获得页表的基地址指针寄存器“Page Map Level-4 Base Address”,之后通过4级索引最终获得4KB大小的物理页面,完成虚拟内存到物理地址的转换。AMD处理器也支持大页方式,如果使用三级索引,可以获得2MB大小的物理页面;使用用二级索引,可以获得1GB大小的页面。
IOMMU使用的I/O页表结构基于以上结构,但做出了一定的改动。在IOMMU中,4级I/O页表指针可以直接指向2级I/O页表指针,从而越过第3级I/O页表,使用这种方法可以节省Page Table(页表)的空间。如图13-7所示:
当设备进行DMA操作时,首先需要从相应的Device Table的Entry中获得“Level 4 Page Table Address”指针,并定位设备使用的I/O页表,最后使用多级页表结构,最终完成PCI总线地址到HPA地址的转换。Page Table的 Entry由64位组成,其主要字段如下所示:
- 第51~12位为Next Table Address/Page Address字段,该字段存放下一级页表或者物理页面的地址。该地址为系统物理地址,属于HPA空间。
- 第11~9位为Next Level字段,表示下一级页表的级数。其中在Device Table中存放的级数一般为4,Level-N级页表中存放的Next Level字段为N-1 ~ 1。
如图13-7所示,在第4级页表的Enry中的Next Level字段为2,表示第4级页表直接指向第2级页表,而忽略第3级页表。当该字段为0b000或者0b111时,表示下一级指针指向物理页面而不是页表。Next Level字段为0b000时,表示所指向的物理页面的大小是固定的,AMD64支持4KB、2MB、1GB、512GB和1TB(SP=4)大小的固定页面;当Next Level字段为0b111时,表示所指向的物理页面大小是浮动的。如果Level 2 Page Table的Entry中的Next Level字段为0b111,则表示该Entry指向的物理页面大小浮动,物理页面的大小和GPA的第29~21位相关,如表13-1所示:
AMD64处理器使用这种I/O页表方式,可以方便地支持4KB、8KB、……、4GB大小的浮动物理页面。除了I/O页表外,IOMMU也设置了IOTLB,以加快GPA到HPA地址的转换。这部分内容与IA处理器的实现方式类似,本章不对此继续进行描述。对IOMMU感兴趣的读者可以参考AMD I/O Virtualization Technology Specification。
至此,“13.1 IOMMU”的全部内容就讲解完了。