澄清PCI内存寻址和I/O寻址之间的区别?

Kev*_*inM 7 memory pci virtual-memory

有人可以澄清一下 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 寻址已被弃用,而取而代之的是内存寻址?

谢谢!

Ser*_*rge 4

由于 64 位寻址,现在的物理地址空间非常巨大。许多设备(例如符合 AHCI 的磁盘控制器)需要相当大的地址空间块才能映射到设备寄存器。

此外,IO 地址空间无法使用通常的汇编指令访问。它只能通过可以读取和写入 IO 端口的特殊指令来访问。在很多情况下这并不是很方便而且效率低下。

例如,上述 ACPI 兼容控制器具有一些功能,要求处理器执行锁定的读取-修改-写入操作以更改设备寄存器中的单个位,前提是其他内核无法访问和修改其间的同一寄存器。对于 IO 地址空间,这是根本不可能的。

我们还应该考虑的一点是 PCI 总线并不是 x86 架构所独有的。还有其他架构根本没有特殊的 IO 总线。因此设备供应商宁愿不使用 IO 地址来保持与大多数系统的兼容性。因此没有人在使用 IO 地址空间。那么为什么不将早已事实上存在的事情变为法律呢?