PCIe 配置 Space 与 ECAM

PCIe Configuration Space vs ECAM

PCIe ECAM是否和"PCI-Compatible Configuration Registers"完全一样只是映射到内存而不是I/O?

在我看来,PCIe 使用与传统 PCI 相同的配置机制:[1]

| 31 | 30 - 24 | 23 - 16 | 15 - 11 | 10 - 8 | 7 - 2 | 1 - 0 | | Enable | Reserved | Bus Nr | Device Nr | Function Nr | Register Nr | 00 |

但在 PCIe 中,您可以使用保留字节来寻址函数的更多寄存器。 这是正确的吗?

在第 7.2.1 节 [2] 中,ECAM 定义为:

| 27 - 20 | 19 - 15 | 14 - 12 | 11 - 8 | 7 - 2 | 1 - 0 | | Bus Nr | Dev Nr | Function Nr | Ext. Register Nr | Register Nr | Byte Enable |

看起来和常规配置非常相似。 只有保留位被转移到它们在 PCIe 中扩展的寄存器编号。 但是我可以像旧的一样使用它们吗?只在内存中解决它们 space 而不是 IO space?

[1] https://wiki.osdev.o/PCI#Configuration_Space_Access_Mechanism_.231 [2] in PCI Express Base Specification, Rev. 4.0 Version 1.0

您在比较中混用了苹果和橙子。第一个地址解码由 PC-AT 架构系统 (*) 上的主桥组件提供。这是一种使用 Intel 处理器的 I/O 地址 space 连接到 PCI 总线配置 space 机制的方法。它可以用于 PCIe 系统,因为PCIe 主桥组件为 PCIe 设备提供相同的接口。但是,主桥以下 的所有内容在 PCI 和 PCIe 之间的实现方式完全不同。

同时,您展示的第二种解码方案只能在内存映射块中使用,PCIe 通过该内存映射块提供对其扩展配置的访问 space。并且仅在该块以系统相关的方式映射到物理地址 space 之后。

因此,虽然它们具有相似的功能,但您不能以相同的方式使用它们。您可以:

  1. 使用第一种机制访问任何 PCI 或 PCIe 设备配置的前 256 个字节 space,但您必须使用第一种寻址方案,或者
  2. 使用第二种机制访问任何 PCIe 设备的整个扩展配置 space(包括 前 256 个字节),但是您必须使用第二种寻址方案.

(*) "I/O space interface to PCI bus configuration via 0xCF8 / 0xCFC" 确实是 Intel / PC-AT 架构的一部分。其他系统架构(例如 MIPS)没有单独的 I/O 地址 spaces,为它们设计的主机桥有不同的机制来生成 PCIe 配置 space 访问(或者它们只是使用内存映射机制)。