接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(3)
13.1 IOMMU
13.1.2 IA处理器的VT-d
IA(Intel Architecture)处理器使用VT-d技术将PCI总线域的物理地址转换为HPA地址。这个映射过程也被称为DMA Remapping。IA处理器系统使用DMA Remapping机制可以辅助虚拟化技术对外部设备进行管理。
在IA处理器系统中,所有的外部设备都是PCI设备。每一个设备都唯一对应一个Bus Number、Device Number和Function Number。为此,IA处理器设置了一个专门的结构,即Root Entry Table,管理每一棵PCI总线树(如果处理器系统有多个PCI总线树,则需要多个Root Entry Table)。在这种结构下,每一个PCI设备根据其Bus(总线)号、Device(设备)号、Function(功能)号,唯一确定一个Context Entry。VT-d将这个结构称为“Device to Domain Mapping”结构,如图13-3所示:
VT-d一共设置了两种结构描述PCI总线树结构,分别为Root Entry和Context Entry。其中,Root Entry描述PCI总线,一棵PCI总线树最多有256条PCI总线,每一条PCI总线对应一个Root Entry;每条PCI总线中最多有32个设备,而每个设备最多有8个Function,而每一个Function又对应一个Context Entry,因此每个Context Entry表中共有256个表项。
在一个处理器系统中,一个指定的PCI Function唯一对应一个Context Entry,这个Context Entry指向这个PCI Function使用的地址转换结构(Address Translation Structures)。当一个PCI Function隶属于不同的Domain时,将使用不同的地址转换结构。但是在一个时间段里,PCI Function只能使用一个地址转换结构,即Context Entry只能指向一个Domain的地址转换结构。这个地址转换结构的主要功能是完成PCI总线域到HPA存储器域的地址转换。
如前文图13-1所示,当一个设备进行DMA操作时,Domain使用PCI总线域的地址填写此设备和与DMA传送相关的寄存器;当这个设备启动DMA操作时,将使用PCI总线地址,之后通过DMA Remapping机制,将PCI总线域地址转换为HPA存储器域地址;然后将数据传送到实际的物理地址空间中。而Domain通过处理器的MMU机制将GPA转换为HPA,访问物理地址空间。
图13-1 DMA-Remapping的实现
从图13-3中可以发现,每一个Function在每一个Domain中都可能有一个地址转换结构,以完成GPA到HPA的转换,因此在每一个Domain中,最多有256个地址转换结构。这些结构无疑将占用内存部分,但是并不会产生较大的浪费。因为在实际设计中,同一个Domain下的所有PCI设备使用的总线地址到HPA地址的转换结构可以相同。因此在实践中,每个Domain仅使用一个地址转换结构即可。
IA处理器使能VT-d后,PCI设备进行DMA操作,需要根据Bus、Device和Function号确定Context Entry,之后使用图13-4所示的方法完成PCI总线地址到HPA地址的转换。
在上图中,4KB Page Table(页表)中的每个Entry的大小为8B(Byte),因此在计算偏移时,需要左移3位。PCI总线地址通过三级目录,最终找到与HPA对应的4KB大小的页面,从而完成PCI总线地址到HPA的转换。值得注意的是,IA处理器还支持2MB(SP=1)、1GB(SP=2)、512GB(SP=3)和1TB(SP=4)大小的Super Page,而本节仅使用了4KB大小的页面。
为了加快PCI总线地址到HPA地址的转换速度,IA处理器分别为Root Entry和Context Entry设置了Context Cache以加快Context Entry的获取速度,同时还设置了IOTLB加速PCI总线地址到HPA地址的转换速度。
IOTLB相当于I/O页表的Cache,当一个PCI设备进行DMA操作时,首先在IOTLB中查找PCI总线地址与HPA地址的映射关系。如果在IOTLB命中,则PCI设备直接获得HPA地址进行DMA操作;如果未在IOTLB命中,则需要使用图13-4中所示的步骤进行PCI总线地址到HPA地址的转换。
Intel并未公开“没有在IOTLB命中”的实现细节。当出现这种情况时,IA处理器可能使用内部的Microcode完成图13-4所示的算法。
使用VT-d,除了可以有效地支持虚拟化技术以外,还可以支持一些只能访问32位地址空间的PCI设备访问4GB之上的物理地址空间。
更多内容请看下回。