pci_map_single函数的主要作用是通过ptr参数,获得与之对应的dma_addr,即进行存储器域虚拟地址到PCI总线域物理地址的转换。值得注意的是存储器域物理地址与PCI总线域物理地址的区别。起初在x86处理器中,存储器域物理地址到PCI总线域物理地址的转换非常简单,是直接相等的关系。在PowerPC处理器中,存在一组Inbound寄存器,通过该组寄存器可以将PCI总线地址转换为PowePC处理器规定的存储器地址,详见第2.2节。......
2023-10-20
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。
图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所示。
图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区域的大小
当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进行地址转换的负担,同时避免虚拟机中存在的安全隐患。
有关PCI Express体系结构导读的文章
pci_map_single函数的主要作用是通过ptr参数,获得与之对应的dma_addr,即进行存储器域虚拟地址到PCI总线域物理地址的转换。值得注意的是存储器域物理地址与PCI总线域物理地址的区别。起初在x86处理器中,存储器域物理地址到PCI总线域物理地址的转换非常简单,是直接相等的关系。在PowerPC处理器中,存在一组Inbound寄存器,通过该组寄存器可以将PCI总线地址转换为PowePC处理器规定的存储器地址,详见第2.2节。......
2023-10-20
图6-13 Message请求TLP头格式PCIe总线规定了以下几类消息报文。本节将重点讲述INTx中断和错误信息相关的消息报文,请读者阅读PCIe总线规范了解其他消息报文。在PCIe总线中,PCIe设备可以使用Legacy中断方式提交中断请求,此时需要使用INTx中断消息报文向RC通知中断事件。设备收到该消息报文后,将结束收到的INTx中断消息报文,然后产生一个新的INTx中断消息报文。......
2023-10-20
假设在一个32位处理器中,存储器域的0xF000-0000~0xF7FF-FFFF这段物理地址空间与PCI总线的地址空间存在映射关系。图3-1 存储器域与PCI总线域的映射关系当PCI设备使用DMA机制访问存储器域地址空间时,处理器系统同样需要将存储器域的地址空间反向映射到PCI总线地址空间。本章采用图3-1的映射关系,虽然增加了映射复杂度,却便于读者深入理解存储器域到PCI总线域之间的映射关系。......
2023-10-20
存储器读写请求TLP的格式如图6-8所示。在存储器读写和I/O读写请求的第3和第4个双字中,存放TLP的32或者64位地址。存储器、I/O和原子操作读写请求使用的TLP头较为类似。此时与这个存储器读请求TLP对应的读完成TLP中不包含有效数据。......
2023-10-20
TOLUD~4GB这段PCI总线地址空间主要映射和ICH相连的PCI设备地址空间,此外还包括EPBAR指向的空间,以及MCHBAR和DMIBAR指向的空间等。FSB Interrupts存储器空间与MSI中断机制相关,PCIe设备向这段存储器空间进行写操作时,MCH将这个写操作转换为FSB总线的Interrupt Message总线事务。DMI Interface负向译码空间被分为若干段,用来映射ICH使用的PCI总线地址空间。这些PCI设备的BAR空间被映射到这段空间。由以上说明可以发现与MCH连接的PCIe设备的访问延时小于与ICH连接中的PCIe设备。......
2023-10-20
PCI总线提供了INTA#、INTB#、INTC#和INTD#四个中断请求信号,PCI设备借助这些中断请求信号,使用电平触发方式向处理器提交中断请求。PCI设备的这些中断请求信号可以通过某种规则进行线与,之后与中断控制器的中断请求信号线相连。而处理器系统需要预先知道这个规则,以便正确处理来自不同PCI设备的中断请求,这个规则也被称为中断路由表,有关中断路由表的详细描述见第1.4.2节。......
2023-10-20
PCI设备保证在数据到达目的地之后,再提交中断请求。但是使用MSI中断机制可以取消PCI总线这个INTx#边带信号,可以解决使用INTx中断机制所带来的数据完整性问题。而更为重要的是,PCI设备使用MSI中断机制,向处理器系统提交中断请求时,还可以通知处理器系统产生该中断的原因,即通过不同中断向量号表示中断请求的来源。本书将在第10章详细介绍MSI中断机制。......
2023-10-20
图2-4 MPC8548处理器存储器域到PCI域的转换在介绍MPC8548处理器如何使用Outbound寄存器组进行存储器域地址空间到PCI总线域地址空间的转换之前,本节将首先介绍Outbound寄存器组中的相应寄存器。该位是Outbound窗口的使能位,为1表示当前Outbound寄存器组描述的存储器地址空间到PCI总线地址空间的映射关系有效;为0表示无效。检查LAWBAR和LAWAR寄存器,判断当前36位的物理地址是否属于PCI总线空间。......
2023-10-20
相关推荐