我是一个刚开始了解 PCI Express 协议的初学者,需要对其机制进行一些说明。
我理解 PCI Express 端点设备可能在系统内存中映射了一些内存 BAR(我们谈论的系统内存总是 RAM 吗?)。我需要了解当我从 CPU 向设备 (A) 发送内存读取请求,寻址某个内存地址(第一个内存 BAR,偏移量 0)时会发生什么。
我们假设我的设备没有任何设备内内存。
代表 CPU 的根联合体创建 TLP 并将其转发到设备(A),因为目标的内存地址已分配给(A)。
A 接收 TLP、解包并创建一个包含来自其内部应用程序逻辑的数据的完成 TLP。
现在,TLP 向后移动到根联合体,对其进行解包、收集有趣的数据并将其返回给 CPU。
此次通信期间系统内存的角色是什么?无?
除了向端点发送和接收数据包之外,根联合体是否(在这种情况下)与系统的物理内存进行通信?
对于某些人来说,这似乎是一个愚蠢的问题,但对我来说,这对于理解物理内存和分配给每个 PCI Express 设备的内存地址 BAR 之间的联系至关重要。
答案1
当 CPU 与内存地址通信时,不必由 RAM 做出响应。它可以是 I/O 设备。实际上,您可以将 RAM 视为“专用内存映射 I/O 设备”,其工作只是保存和返回数据,尽管对于具有缓存等功能的当今现代 CPU,这在物理上并不简单。
我不太了解 PCIe 的底层细节,但您似乎想知道 PCIe 总线本身如何与 CPU 通信。它就像任何其他与 CPU 通信的东西一样:
- 内存映射 - 即设备被“映射”,其中对一系列地址的读取和写入不会转到 RAM,而是转到设备或控制器。
- DMA——外部设备或控制器读取/写入一部分 RAM,完全无需 CPU 参与。
- I/O 端口 - 这只是另一个地址空间(Intel x86 CPU 系列的一个功能),历史上一直专用于 I/O 设备。您永远不会在这里找到 RAM,但它的工作方式类似于内存映射。I/O 端口和内存映射之间的主要区别在于,I/O 端口指令始终按顺序工作,这里不会发生操作的“无序”或“重新排序”,而 CPU 则试图通过访问主内存来做到这一点。
- IRQ——外部设备向 CPU 发送中断
BAR 等被“映射”到内存中,并取代可能位于其“下方”的任何 RAM。我相信,使用 MMU 可以将其下方的 RAM“重新映射”到不同的物理地址。