有人可以解释一下 PCI/PCIe 总线上内存和 I/O 地址之间的区别吗?
我知道 I/O 地址是 32 位的,限制在 0 到 4GB 范围内,并且不映射到系统内存(RAM),并且内存地址是 32 位或 64 位。
我感觉内存寻址必须映射到可用 RAM,这是真的吗?如果 PCI 设备希望将数据传输到内存地址,则该地址必须存在于实际系统 RAM 中(并在 PCI 配置期间分配),而不是虚拟内存中。
因此,如果 PCI 设备一次只需要传输少量数据,而将其放入 RAM 或使用 DMA 没有任何优势,则 I/O 寻址就可以了(例如,在 PCI 卡上实现的并行端口)。
为什么我总是读到 PCI/PCIe I/O 寻址被弃用而改用内存寻址?
谢谢!
答案1
由于 64 位寻址,物理地址空间如今非常巨大。许多设备(例如 AHCI 兼容磁盘控制器)需要将相当大的地址空间映射到设备寄存器。
此外,IO 地址空间无法通过通常的汇编指令访问。只能通过可以读取和写入 IO 端口的特殊指令来访问。这在很多情况下并不方便且效率低下。
例如,上面提到的 ACPI 兼容控制器具有一些功能,需要处理器执行锁定的读取-修改-写入操作来更改设备寄存器中的单个位,前提是在此期间没有其他核心能够访问和修改同一寄存器。对于 IO 地址空间,这根本是不可能的。
我们需要考虑的另一点是,PCI 总线并非 x86 架构所独有。还有其他架构根本没有特殊的 IO 总线。因此,设备供应商倾向于不使用 IO 地址以保持与大多数系统的兼容性。因此没有人使用 IO 地址空间。那么为什么不将早已事实上存在的东西变成法律呢?