我了解 CPU 可以配置 PCI 和 PCIe 设备(通过 BIOS 或操作系统中的代码),通过写入设备配置空间的特定区域来响应某些物理内存地址。
事实上,考虑到设备的许多要求(内存对齐、DMA 功能等),Linux 内核具有相当复杂的算法来执行此操作。
看到该软件似乎可以控制该内存是否映射、何时以及在何处映射,我的问题是:一个软件如何控制物理内存的映射?
在这个配置之后,PCI 设备将知道响应给定的地址范围,但是 CPU 怎么知道它应该在 PCI 总线上为那些刚刚动态决定的特定地址?
我了解 CPU 可以配置 PCI 和 PCIe 设备(通过 BIOS 或操作系统中的代码),通过写入设备配置空间的特定区域来响应某些物理内存地址。
事实上,考虑到设备的许多要求(内存对齐、DMA 功能等),Linux 内核具有相当复杂的算法来执行此操作。
看到该软件似乎可以控制该内存是否映射、何时以及在何处映射,我的问题是:一个软件如何控制物理内存的映射?
在这个配置之后,PCI 设备将知道响应给定的地址范围,但是 CPU 怎么知道它应该在 PCI 总线上为那些刚刚动态决定的特定地址?
北桥使用要路由到内存控制器的地址范围进行编程。所有其他地址都转到外部总线。
它基于 CPU 拥有的地址映射信息。如果它是 64 位处理器,通常你有 2^64 -1 个地址线和 CPU。现在内存大约是 16 GB,即 2^34 大约是 16 GB。因此 CPU 拥有的所有设备(甚至是传统的 PCI 和 PCIe 设备)及其配置空间都可以映射到此 RAM 物理地址空间上方的地址线。对该空间的任何 IO 都可以转发到相应的设备。在我们的例子中,CPU 发现它想要访问的配置空间是 PCI 或 PCIe 设备,然后它将指令转发到 CPU 的主机桥(00:00:00 Do lspci in a box,您将看到主机桥这个 BDF)
一旦发现目标设备在主机桥中,指令(可以是 IO 或内存)将被转换为适当的 TLP 请求。