pci - PCIe 配置空间与 ECAM
问题描述
PCIe ECAM 是否与仅映射到内存而不是 I/O 的“PCI-Compatible Configuration Registers”完全相同?
在我看来,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 中扩展的寄存器号。但我可以像旧的一样使用它们吗?只在内存空间而不是 IO 空间中寻址它们?
[1] https://wiki.osdev.o/PCI#Configuration_Space_Access_Mechanism_.231 [2] PCI Express Base Specification, Rev. 4.0 Version 1.0
解决方案
在比较中,您将苹果和橙子混合在一起。第一个地址解码由 PC-AT 架构系统 (*) 上的主机桥组件提供。这是一种使用 Intel 处理器的 I/O 地址空间与 PCI 总线配置空间机制接口的方式。它也可以在 PCIe 系统上使用,因为PCIe 主机桥组件为 PCIe 设备提供相同的接口。但是,在 PCI 和 PCIe 之间,主机桥下的所有内容的实现方式完全不同。
同时,您展示的第二种解码方案只能在内存映射块内使用,PCIe 通过它提供对其扩展配置空间的访问。并且只有在该块以系统相关的方式映射到物理地址空间之后。
因此,尽管它们具有相似的功能,但不,您不能以相同的方式使用它们。你可以:
- 使用第一种机制访问任何 PCI 或 PCIe 设备配置空间的前 256 个字节,但您必须使用第一种寻址方案,或者
- 使用第二种机制(包括前 256 个字节)访问任何 PCIe 设备的整个扩展配置空间,但是您必须使用第二种寻址方案。
(*) “通过 0xCF8 / 0xCFC 配置 PCI 总线的 I/O 空间接口”确实是 Intel / PC-AT 架构的一部分。其他系统架构(例如 MIPS)没有单独的 I/O 地址空间,为它们设计的主机桥具有不同的机制来生成 PCIe 配置空间访问(或者它们只是直接使用内存映射机制)。
推荐阅读
- python - 如何根据 Python 3 中另一个列表的长度动态创建列表
- arrays - 如何在 Google 表格中选择包含通过自定义公式过滤的某些单词的行
- python - 将多维数组乘以一维数组Python
- android - 当我制作构建 apk 时,GitHub Desktop 不会检测到更改?
- javascript - 在设置 document.getElementById 和 sessionStorage.setItem 时遇到问题
- c# - 如何从泛型接口获取方法传递给泛型类?
- css - Font Awesome 5 - 为什么调整字体系列时图标会消失?
- java - 如何在 Eclipse 中自定义“新”选项
- c# - 是否有任何适当的方法可以从通过某些特定字符串值搜索的 OLEDB 连接中检索数据?
- android - 无法更改 Android 虚拟设备 (AVD) 上的文件权限