接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(4)
2.1.3 处理器域内容较多,为了便于理解,余下内容放到本回。
2.1.3 处理器域
HOST主桥进行不同地址域间的数据交换时,需要遵循以下规则。为区别存储器域到PCI总线域的地址映射,下面将PCI总线域到存储器域的地址映射称为反向映射。
(1)处理器访问PCI总线域地址空间时,首先需要访问存储器域的地址空间,再通过HOST主桥将存储地址转换为PCI总线地址,之后才能进入PCI总线域进行数据交换。PCI设备使用的地址空间保存在各自的PCI配置寄存器中,即BAR寄存器中。这些PCI总线地址空间需要在初始化时映射成为存储器域的存储器地址空间,之后处理器才能访问这些地址空间。在有些处理器的HOST主桥中,具有独立的寄存器保存这个地址映射规则,如PowerPC处理器的Outbound寄存器组;而有些处理器,如在x86处理器中,虽然没有这样的寄存器组,但是在HOST主桥的硬件逻辑中仍然存在这个地址转换的概念(上回曾讲到)。
(2)PCI设备访问存储器域时,首先需要访问PCI总线域的地址空间,再通过HOST主桥将PCI总线地址转换为存储器地址,才能穿越HOST主桥进行数据转换。为此,处理器需要通过HOST主桥将这个PCI总线地址反向映射为存储器地址。PCI设备不能访问在PCI总线域中没有进行这种反向映射的存储器域地址空间。PowerPC处理器使用Inbound寄存器组存放PCI设备所能访问的存储器空间,而在x86处理器中并没有这样的寄存器组,但是依然存在这个地址转换的概念。
(3)如果HOST主桥不支持Peer-to-Peer传送方式,那么分属不同PCI总线域的PCI设备间不能直接进行数据交换。在32位的PCI总线中,每一个PCI总线域的地址范围都是0x00000000~0xFFFFFFFF,但是这些地址没有直接联系。PCI总线x域上的PCI总线地址0x00000000与PCI总线y域上的PCI总线地址0x00000000并不相同,而且这两个PCI总线地址经过HOST主桥反向映射(PCI总线域到存储器域的地址映射)后,得到的存储器地址也不相同。
在PowerPC处理器中,HOST主桥的实现比较完整,尤其是PCI总线域与存储器域的映射关系比较清晰,便于读者准确掌握这一重要概念;而在x86处理器中,由于考虑向前兼容(backward compatibility),设计中包含了太多的不得已。x86处理器有时不得不保留原设计中的不完美。向前兼容是Intel的重要成就,也是一个“沉重的十字架”。
至此,第2章第1节“存储器域与PCI总线域”全部结束。