【摘要】:IA处理器使用VT-d技术将PCI总线域的物理地址转换为HPA地址。在IA处理器系统中,所有的外部设备都是PCI设备。IA处理器使能VT-d机制后,PCI设备进行DMA操作需要根据Bus、Device和Function号确定Context Entry,之后使用图13-4所示的方法完成PCI总线地址到HPA地址的转换。为了加快PCI总线地址到HPA地址的转换速度,IA处理器分别为Root Entry和Context Entry设置了Context Cache以加快Context Entry的获取速度,同时还设置了IOTLB加速PCI总线地址到HPA地址的转换速度。
IA(Intel Architecture)处理器使用VT-d技术将PCI总线域的物理地址转换为HPA地址。这个映射过程也被称为DMA Remapping。IA处理器系统使用DMA Remapping机制可以辅助虚拟化技术对外部设备进行管理。
在IA处理器系统中,所有的外部设备都是PCI设备。每一个设备都唯一对应一个Bus Number、Device Number和Function Number,为此IA处理器设置了一个专门的结构,即Root Entry Table[112],管理每一棵PCI总线树。在这种结构下,每一个PCI设备根据其Bus、Device和Function号唯一确定一个Context Entry。VT-d将这个结构称为“Device to Domain Map-ping”结构,如图13-3所示。

图13-3 Device to Domain Mapping结构
VT-d一共设置了两种结构描述PCI总线树结构,分别为Root Entry和Co ntext Entry。其中Root Entry描述PCI总线,一棵PCI总线树最多有256条PCI总线,其中每一条PCI总线对应一个Root Entry;每条PCI总线中最多有32个设备,而每个设备最多有8个Function,其中每一个Function对应一个Context Entry,因此每个Context Entry表中共有256表项。
在一个处理器系统中,一个指定的PCI Function唯一对应一个Context Entry,这个Con-text Entry指向这个PCI Function使用的地址转换结构(Addre ss 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-3中可以发现,每一个Function在每一个Domain中都可能有一个地址转换结构,以完成GPA到HPA的转换,因此在每一个Domain中最多有256个地址转换结构。这些结构无疑将占用部分内存,但是并不会产生较大的浪费。因为在实际设计中,同一个Do-main下的所有PCI设备使用的总线地址到HPA地址的转换结构可以相同。因此在实现中,每个Domain仅使用一个地址转换结构即可。(www.chuimin.cn)
IA处理器使能VT-d机制后,PCI设备进行DMA操作需要根据Bus、Device和Function号确定Context Entry,之后使用图13-4所示的方法完成PCI总线地址到HPA地址的转换。

图13-4 VT-d使用的PCI总线地址到HPA的转换机制
在上图中,4KB Page Table中的每个Entry的大小为8B,因此在计算偏移时,需要左移3位,PCI总线地址通过3级目录,最终找到与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之上的物理地址空间。
相关推荐