首页 理论教育AMD处理器IOMMU功能详解

AMD处理器IOMMU功能详解

【摘要】:AMD处理器的IOMMU技术与Intel的VT-d技术类似,其完成的主要功能也类似。AMD率先提出了IOMMU的概念,并发布了IOMMU的技术手册,但是Intel首先将这一技术在芯片中实现。AMD处理器使用HT总线连接I/O Hub,其中每一个I/O Hub都含有一个IOMMU,其结构如图13-5所示。图13-5 AMD处理器的IOMMU结构其中每一个IOMMU都使用一个Device Table。表13-1 Next Level字段为0b111时的页表大小AMD64处理器使用这种IO页表方式,可以方便地支持4KB、8KB、……

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所示。

978-7-111-29822-9-Part02-200.jpg

图13-5 AMD处理器的IOMMU结构

其中每一个IOMMU都使用一个Device Table。AMD处理器使用Device Table存放图13-3中的结构,Device Table最多由216个Entry组成,其中每个Entry的大小为256b,因此Device Table最大将占用2MB内存空间,与Intel使用的Root/Context Entry结构相比,AMD使用的这种方法容易造成内存的浪费。

在I/O Hub中的设备[113]使用16位的DeviceID在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所示。

978-7-111-29822-9-Part02-201.jpg

图13-6 AMD64虚拟地址到物理地址的页表结构(www.chuimin.cn)

978-7-111-29822-9-Part02-202.jpg

图13-7 IOMMU使用的GPA到HPA的转换机制

当设备进行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级页表的Entry中的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的En-try中的Next Level字段为0b111,表示该Entry指向的物理页面大小浮动,其中物理页面大小和GPA的第29~21位相关,如表13-1所示。

表13-1 Next Level字段为0b111时的页表大小

978-7-111-29822-9-Part02-203.jpg

AMD64处理器使用这种IO页表方式,可以方便地支持4KB、8KB、……、4GB大小的浮动物理页面。除了I/O页表外,IOMMU也设置了IOTLB以加快GPA到HPA地址的转换,这部分内容与IA处理器的实现方式类似,本章不对此继续进行描述。对IOMMU感兴趣的读者可以参考AMD I/O Virtualization Technology Specific ation。