接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(5)
13.2 ATS(Address Translation Services)
单纯使用IOMMU并不能充分发挥处理器系统的效率,从图13-2中可以发现,
所有的PCI设备在进行DMA操作时,都需要经过TA和ATPT进行地址翻译,然后才能访问主存储器。因而TA和ATPT很容易成为瓶颈,从而影响虚拟化系统的整体效率。
除此之外,在图13-2中,EP1和EP2分别隶属于Domain1和Domain2。在正常情况下,一个Domain并不能访问其它Domain的PCI设备。但是如果处理器系统中存在一个恶意的虚拟机,而且EP1隶属于该虚拟机(Domain1)。当EP1进行DMA写操作时,该虚拟机填写的DMA写地址可以与EP2的BAR地址空间重合,那么启动DMA写操作时,Domain1可以将数据传递到EP2,从而影响Domain2的正常运行。
解决这种异常最合理的方法是,隶属于Domain1的PCI设备只能访问GPA1的空间,而仅使用IOMMU并不能解决该问题。解决该问题较为有效的方法是PCI设备进行数据传送的同时也进行地址转换,从而使该PCI设备使用的地址是经过转换的HPA地址。此时再进行DMA写时,该数据将传递到与Domain1对应的HPA是地址空间中,而不会将数据传送到EP2。这样,这个恶意的虚拟机并不会影响其它正常工作的虚拟机。
PCIe总线使用ATS(Address Translation Services)机制实现PCIe设备的地址转换。支持ATS机制的PCIe设备,内部含有ATC(Address Translation Cache),ATC在PCIe设备中的位置如图13-8所示:
在ATC中存放ATPT的部分内容,当PCIe设备使用地址路由方式发送TLP时,其地址首先通过ATC转换为HPA地址。如果PCIe设备使用的地址没有在ATC中命中时,PCIe设备将通过存储器读取TLP从ATPT中获得相应的地址转换信息,更新ATC后,再发送TLP。
与其它Cache类似,ATC还可以被Invalidate。当ATPT被更改时,处理器系统将发送Invalidate报文,同步在不同PCIe中的ATC。
PCIe总线在TLP中设置了AT字段以支持ATS机制。在PCIe总线中,只有与存储器相关的TLP支持AT字段。值得注意的是,只有处理器系统支持IOMMU时,PCIe设备才可以使用ATS机制。
13.2.1 TLP的AT字段
TLP的AT字段与ATS机制直接相关。根据AT字段的不同,PCIe设备可以发送三种类型的TLP。
1. AT字段为0b00
当AT字段为0b00时,当前TLP的Address字段没有通过ATC进行转换,存放的是PCI总线域的物理地址。
如果PCIe设备不支持ATS机制,而且处理器系统也没有使能IOMMU时,当前TLP的Address字段为PCI总线域的物理地址。PCIe设备进行DMA操作时,该地址被RC转换为存储器域的物理地址,然后对存储器进行读写操作;
如果PCIe设备不支持ATS机制,但是当前处理器支持IOMMU时,当前TLP的Address字段依然为PCI总线域的物理地址。PCIe设备进行DMA操作时,该地址将被TA根据I/O页表的设置,转换为合适的存储器域物理地址。
如果当前处理器系统支持虚拟化技术,当前PCIe设备将隶属于某一个Domain,此时该PCIe设备进行DMA操作时,数据将被传送到属于该Domain的存储器域中。
2. AT字段为0b01
当AT字段为0b01时,表示当前TLP报文为“Translation Request”报文。支持ATS机制的PCIe设备,必须支持这类报文。
该报文由PCIe设备通过存储器读请求TLP发出,其目的地为TA。TA收到报文后,将根据I/O页表的设置,将合适的地址转换关系,通过存储器读完成TLP,发送给PCIe设备。而PCIe设备收到此地址转换关系后,将更新ATC。
3. AT字段为0b10
当AT字段为0b10时,表示当前TLP的Address字段已经通过ATC进行地址转换。当PCIe设备使用存储器读写报文进行DMA操作,而RC收到这些报文时,将不再通过TA和ATPT进行地址转换,而直接将数据发送给存储器。从而减轻了ATPT进行地址转换的压力。
值得注意的是,经过ATC进行地址转换后,在TLP的Address字段中存放的依然是PCI总线域的物理地址,该物理地址为HPA地址在PCI总线域中的映像。
如果TLP中的Address字段没有经过ATC进行地址转换,并且处理器系统支持虚拟化技术,该地址为仍然对应GPA地址在PCI总线域中的映像。此时该TLP使用的AT字段为0b00。这些地址在经过RC后,将被转换为存储器域的地址,然后进入TA和ATPT再次进行地址转换。由以上描述可以发现,PCIe设备无论是否使用ATC机制,在TLP中存放的Address字段仍然保存的是PCI总线域地址。
更多内容请看下回。