1.概述
PCIe总线的最大特点是像CPU访问DDR一样,可以直接使用地址访问PCIe设备(桥),但不同的是DDR和CPU同属于存储器域,而CPU和PCIe设备属于两个不同的域,PCIe设备(桥)的地址空间属于PCIe总线域。存储器域访问PCIe总线域或者PCIe总线域访问存储器域,需要经过一系列的转换才可以完成。
2.跨域访问
下图是存储器域访问PCIe域和PCIe域访问存储器域的示意图。通常情况下,存储器域指的是CPU能直接访问的地址空间,包括了CPU寄存器、DRAM、PCIe控制器和PCIe窗口地址空间。PCIe总线域指由PCIe设备所能直接访问的地址空间组成,包括PCIe桥设备和PCIe Swtich,若由多条PCIe总线,则对应多个PCIe总线域,若RC不支持Peer-to-Peer传送方式,则PCIe总线域之间不能相互访问。
图中出现的名词解释如下:
- Outbound: 存储器域访问PCIe总线域称为Outbound传输,从RC或EP的角度看,也可以称为发送。
- Inbound: PCIe总线域访问存储器域称为Inbound传输,从RC或EP的角度看,也可以称为接收。
- Outbound ATU(address translation unit): Outbound地址转换单元,负责将存储器域地址转换成PCIe总线域地址。
- Inbound ATU(address translation unit): Inbound地址转换单元,负责将PCIe总线域地址转换成存储器域地址。
- OB windows: Outbound窗口地址段(存储域地址),将该窗口地址段设置到Outbound ATU中,将实现存储域地址到PCIe总线域地址的转换。
- IN windows: Inbound窗口地址段(存储域地址),将该窗口地址段设置到Inbound ATU中,将实现PCIe总线域地址到存储域地址的转换。
注:
- PCIe总线诞生在x86体系结构中,而在x86处理器中,并没有地址转换单元ATU,但存储域和PCIe总线域地址空间的概念仍然存在。
- 存储域和PCIe总线域地址的转换规则PCIe规范中并没有规定,因此不同的处理器架构实现各不相同,因此图中统一使用ATU表示地址转换功能。
- 在多数处理器架构中,RC存储域窗口地址和PCIe总线域地址相同,虽然地址相同,但还是两个不同的域。在x86架构中RC存储域窗口地址为总线地址,arm等架构中,RC存储域窗口地址为物理地址。
- RC存储域访问EP存储域使用PCIe总线域0xA0000000-0xA00FFFFF地址段,EP存储域访问RC存储域使用PCIe总线域0xB0000000-0xB00FFFFF地址段,这两段地址可以重合、可以部分覆盖、也可以不同,没有明确规定,可以由RC分配或者RC和EP约定,图中为了便于区分,分为两段不同的地址。
2.1. RC存储域访问EP存储域
RC存储域访问EP存储域会经历Outbound和Inbound传输。在访问之间RC配置Outbound映射,EP配置Inbound映射。具体过程如下:
- RC存储域发出访问地址,若命中Outbound窗口地址段0xA0000000-0xA00FFFFF,则RC会响应这个访问请求。
- RC存储域Outbound ATU将访问地址转换成PCIe域总线地址,转换后的地址必须在PCIe总线地址段0xA0000000-0xB00FFFFF内,然后将请求发送到PCIe总线上(该请求会被封装成一个TLP事务包,具体会在PCIe总线事物层介绍)。
- 该请求经过基于地址的PCIe总线路由,发送到了访问目标EP存储域。
- EP存储域Inbound ATU将该请求的PCIe总线域地址转换成EP存储器域地址,转换后的地址必须在EP存储域地址段0xC0000000-0xC00FFFFF内,即在IB windows地址段内。
- EP开始响应该请求,执行读或者写任务。
2.2. EP存储域访问RC存储域
EP存储域访问RC存储域会经历Inbound和Outbound传输(EP访问RC通常使用DMA)。在访问之间RC配置Inbound映射,EP配置Outbound映射。具体过程如下:
- EP存储域发出访问地址,若命中Outbound窗口地址段0xD0000000-0xD00FFFFF,则EP会响应这个访问请求。
- EP存储域Outbound ATU将访问地址转换成PCIe域总线地址,然后将请求发送到PCIe总线上。
- 该请求经过基于地址的PCIe总线路由,发送到了访问目标RC存储域。
- RC存储域Inbound ATU将该请求的PCIe总线域地址转换成RC存储器域地址,转换后的地址必须在RC存储域地址段0xB0000000-0xB00FFFFF内,即在IB windows地址段内。
- RC开始响应该请求,执行读或者写任务。
参考资料
- PCIEXPRESS体系结构导读
- PCI Express technology 3.0
- PCI_Express_Base_r3.0_10Nov10