首页 理论教育PCIExpress地址转换请求

PCIExpress地址转换请求

【摘要】:在PCIe总线中,一个地址转换关系由8B组成,这也是地址转换请求TLP的Length字段至少为0b10的原因。当TA收到地址转换请求TLP后,将查找ATPT,然后通过存储器读完成TLP,将转换关系发送给PCIe设备。采用这种方式时,PCIe设备将首先向TA发送地址转换请求TLP,并从ATPT中获得地址转换关系后,使用TA等于0b10的存储器读写TLP,即使用Translated Address与主存储器进行数据交换,从而有效避免了上文所述的安全隐患。

PCIe设备可以使用地址转换请求(Translation Requests)TLP向TA提交地址转换请求。该TLP具有64位和32位两种地址格式。本节仅介绍64位地址格式,如图13-9所示。其中AT字段为0b01表示当前报文为地址转换请求TLP。

该报文的格式与存储器读请求TLP的报文格式基本类似,但是在地址转换请求TLP中,一些字段的含义与存储器读请求TLP并不相同。该报文的作用是将Untranslated Address字段发送到TA,而TA根据ATPT将Untranslated Address数据区域进行翻译,然后通过存储器读完成TLP将地址转换关系发送给PCIe设备。PCIe设备收到这个存储器读完成TLP后将这个地址转换关系保存在PCIe设备的ATC中。

Untranslated Address数据区域的长度由Length字段确定。在地址转换请求TLP中,Length字段的最低位和高5位为0,而且Length字段不能为0b00-0000-0000,因此该地址转换请求TLP所访问的数据区域最小为8B,而最大不能超过RCB。而且该数据区域为1DW对界,First DW BE与Last DW BE字段都为0b1111。

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

图13-9 64位地址转换请求TLP的格式

当PCIe设备与某个虚拟机绑定时,Untranslated Address数据区域的GPA地址连续,但是其对应的HPA地址并不一定连续(在绝大多数虚拟机的实现中,为简化设计,GPA所对应的HPA地址区域地址连续)。因此PCIe设备发送一个地址转换请求后,可能会从TA得到多个地址转换关系,这些地址转换关系可以使用一个存储器读完成TLP发送给PCIe设备。在PCIe总线中,一个地址转换关系由8B组成,这也是地址转换请求TLP的Length字段至少为0b10的原因。

当TA收到地址转换请求TLP后,将查找ATPT,然后通过存储器读完成TLP,将转换关系发送给PCIe设备。如果地址转换成功时,TA使用CplD(带数据的存储器读完成报文)将转换关系发送给PCIe设备;否则使用Cpl将失败信息发送给PCIe设备。本节仅讨论CplD报文,其格式如图13-10所示。

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

图13-10 地址转换完成TLP的格式

地址转换完成TLP的报文头与存储器读完成报文头完全相同,而Payload字段由一个或者多个地址转换关系组成。一个地址转换关系由以下字段与位组成。

●Translated Address[63:12]字段保存与Untranslated Address对应的HPA地址,即经过转换的地址。

●而U位为1时,表示这段HPA空间只能使用Untranslated地址访问,即PCIe设备不能使用AT字段等于0b10的存储器读写TLP;R位为1,表示HPA地址空间可读;W位为1时,表示HPA地址空间可写。(www.chuimin.cn)

●N位为1时,PCIe设备访问这段数据区域时,其存储器读写TLP的No Snoop位必须为0,表示硬件需要进行Cache一致性操作;如果该位为0,PCIe设备将使用其他方法确定No Snoop位是否可以为1。

●S位需要与Translated Address字段联合使用,表示该段数据区域的大小,如表13-2所示。

由该表所示,Translated Address数据区域的最小值为4KB,此时S位必须为0。如果S不为0,则表示这段数据区域大于4KB。当Address31为0,而Address[30:12]和S位都为1时表示,这段区域为4GB,但是4GB并不是Translated Address数据区域的最大值。PCIe设置还可以使用Address[63:32]字段,继续扩展数据区域的大小。

表13-2 Translated Address区域的大小

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

当PCIe设备支持ATS机制并进行DMA操作时,首先查找当前访问的地址是否在ATC中命中,如果命中则直接从ATC中获得Translated Address,并使用AT等于0b10的存储器读写TLP与主存储器交换数据。TA收到AT等于0b10的TLP后,将不使用ATPT进行地址转换,而将报文直接发送到存储器控制器,与主存储器进行数据交换。

如果PCIe设备访问的地址区域没有在ATC中命中时,PCIe设备有两种处理方法,一是使用AT等于0b00的TLP,即使用Untranslated Address直接访问存储器,这个Untranslated Address到达TA后,TA根据ATPT的设置,将Untranslated Address进行地址转换,然后再将报文发送到存储器控制器中。

如果处理器系统中存在恶意的虚拟机时,PCIe设备使用这种方法时将会带来安全隐患。因为恶意的虚拟机可以直接将这个Untranslated Address与其他PCIe设备使用的BAR空间重合,从而该虚拟机可以破坏隶属于其他虚拟机的PCIe设备,干扰其他虚拟机的正常运行,这是虚拟机系统禁止的行为。

因而当PCIe设备访问的地址区间没有在ATC中命中时,应该首先进行地址转换。采用这种方式时,PCIe设备将首先向TA发送地址转换请求TLP,并从ATPT中获得地址转换关系后,使用TA等于0b10的存储器读写TLP,即使用Translated Address与主存储器进行数据交换,从而有效避免了上文所述的安全隐患。

目前尚无支持ATS机制的PCIe设备,但是通过本节的描述可以发现,使用ATS机制可以有效减轻TA进行地址转换的负担,同时避免虚拟机中存在的安全隐患。