PCIE Root Complex如何将PCIe端点的DMA事务传输到主机内存
PCIe RC处理EP发起DMA写事务的问题解答
问题1:PCIe Root Complex如何判断需要将该数据包转发到主机内存
- EP发送的DMA写TLP头部携带目标访问地址,这个地址是EP驱动提前为DMA操作分配、并写入EP DMA控制器寄存器的有效地址,未开启IOMMU时为主机物理地址,开启IOMMU时为IO虚拟地址(IOVA)。
- RC内部预存有系统枚举阶段由BIOS和操作系统共同配置的地址路由表,明确标注了系统地址空间中,哪些范围属于PCIe设备域、哪些属于主机内存域、哪些属于其他外设域。
- 收到TLP后RC首先解析目标地址:
- 开启IOMMU的场景下,先查IOMMU页表将IOVA转换为真实主机物理地址,再做路由匹配;
- 地址落在主机内存地址范围内的TLP会被转发到内存控制器方向,落在其他PCIe设备地址范围的会转发到对应PCIe端口,非法地址会直接返回UR(不支持请求)错误。
问题2:PCIe Root Complex与主机内存的硬件连接,以及数据写入逻辑
- 硬件连接:目前主流x86/ARM处理器都将PCIe RC集成在CPU封装内部,RC直接通过处理器内部一致性总线(如Intel UPI、AMD Infinity Fabric内部链路)和同NUMA节点的内存控制器直连;更早的分立北桥平台中,RC集成在北桥芯片内,北桥同时直连内存控制器和CPU前端总线。如果DMA写目标地址属于其他NUMA节点的内存,RC会将事务通过一致性总线转发到对应NUMA节点的内存控制器处理。
- 不需要RC额外发起DMA写操作:EP发送的DMA写TLP本身已经携带完整的目标地址和待写入数据,RC只需要完成地址校验、协议转换(把PCIe TLP转换成内存控制器能识别的事务格式)后直接递交给内存控制器即可完成写入,全程不需要CPU参与,也不需要RC自身生成新的DMA请求。
内容的提问来源于stack exchange,提问作者SUN
相关产品推荐
相关产品推荐

