PCI Express - 关于 BAR、内存寻址和物理内存的说明

Jac*_*ani 6 memory pci-express pci peripherals

我是一个开始了解 PCI Express 协议的绝对初学者,我需要对其机制进行一些说明。

我知道 PCI Express 端点设备可能在系统内存中映射了一些内存 BAR(它总是 RAM 是我们正在谈论的系统内存吗?)。我需要了解当我从 CPU 向设备 (A) 发送内存读取请求、寻址某个内存地址(第一个内存 BAR,偏移量 0)时会发生什么。

假设我的设备没有任何设备内存。

代表 CPU 的根联合体创建 TLP 并将其转发到设备 (A),因为目的地的内存地址已分配给 (A)。

A 接收 TLP,将其解包,并创建一个包含来自其内部应用程序逻辑的数据的完成 TLP。

现在,TLP 返回到解包它的 Root Complex,收集有趣的数据并将其返回给 CPU。

在此通信过程中,系统内存的作用是什么?没有任何?

根联合体是否与系统的物理内存通信(在这种情况下),而不是向/从端点发送和接收数据包?

对某些人来说,这似乎是一个愚蠢的问题,但对我来说,了解物理内存与分配给每个 PCI Express 设备的内存地址 BAR 之间的联系至关重要。

Law*_*ceC 2

当 CPU 与内存地址对话时,RAM 不需要做出响应。它可以是一个 I/O 设备。实际上,您可以将 RAM 视为“专用内存映射 I/O 设备”,其工作只是保存和返回数据,尽管当今的现代 CPU 具有缓存等功能,但它在物理上并不简单。

我不太热衷于 PCIe 的底层细节,但您似乎想知道 PCIe 总线本身如何与 CPU 通信。它的工作原理与其他与 CPU 通信的东西类似:

  • 内存映射 - 即设备被“映射”,其中一系列地址的读取和写入不会进入 RAM,而是进入设备或控制器。
  • DMA - 外部设备或控制器读取/写入 RAM 的一部分,根本不涉及 CPU。
  • I/O 端口 - 这只是历史上专用于 I/O 设备的另一个地址空间(Intel x86 系列 CPU 的一项功能)。您在这里永远找不到 RAM,但它的工作原理类似于内存映射。I/O 端口和内存映射之间的主要区别在于 I/O 端口指令始终串行工作,这里不会发生“乱序”或“重新排序”操作,这与 CPU 尝试通过访问 main 来执行此操作不同。记忆。
  • IRQ - 外部设备向 CPU 发送中断

BAR 等被“映射”到内存中,并取代可能位于其“下方”的任何 RAM。通过 MMU,我相信可以将其下方的 RAM“重新映射”到不同的物理地址。