为什么PCI设备共享相同的地址空间?

为什么PCI设备共享相同的地址空间?

当计算机启动时,BIOS 或操作系统会探测每个 PCI 设备,询问其需要多少地址空间。然后,它会分配适当的空间并告诉每个 PCI 设备其空间从哪里开始,以便 PCI 设备可以响应该范围内的读写请求。

我的问题是为什么所有设备都需要从相同的地址空间分配块。为什么不给每个设备一个自己的地址空间?

在印刷电路板上,已经存在一种区分 PCI 设备的“带外”方法:IDSEL 线。 这是在 PCI 枚举期间(在每个设备分配其空间之前)使用的内容。 那么为什么不将其也用于枚举后访问,并节省 PCI 设备上的一些解码逻辑呢?这样会不会更慢,还是其他什么原因?

答案1

一般来说,他们不会需要共享相同的地址空间。分离设备的地址空间正是 IOMMU 的用途,并且由于多种原因很有用:

  • 它可以安全地允许虚拟机使用本机驱动程序直接访问物理硬件。
  • 它将设备的寻址能力与物理地址空间分离开来。换句话说,它让你的设备可以只进行 32 位寻址,访问物理内存中的任意数据,甚至超过前 4G。
  • 它可以让您更彻底地隔离设备,从而显著提高系统的安全性。

至于为什么这不是默认行为,以及为什么不为此使用 IDSEL 线,我真的说不出来,因为我对 PCI 设计的历史了解不多。我的第一个猜测是,它最初是为了更容易将 ISA 卡的驱动程序移植到 PCI(ISA 假设一个平面共享地址空间)。此外,IOMMU 并不是最容易设计的硬件,而且最近才在 x86 平台上广泛可用(并且仍然不能保证,许多英特尔芯片仍然没有它们,许多低端 AMD 芯片也没有)。

不过,值得指出的是,使用 PCI Express,跨设备共享地址空间实际上具有优势,即它允许您进行设备到设备的传输(尽管大多数平台不能正确支持这一点),这在使用 RDMA 的大型网格设置中非常有用(您可以直接从远程设备获取数据,而无需在设置传输后通过远程系统的操作系统进行调解)。

答案2

对于 x86 系统,CPU 本身只能访问两个地址空间:普通内存地址空间和 IO 地址空间。其他系统可能只有一个地址空间(例如 ARM、powerpc 等)。从 PCI 设备的角度来看,这两个地址空间是分开的 - 使用不同的命令来访问每个地址空间,并且桥接器对每个地址空间都有单独的配置寄存器。但是,由于 CPU 只能访问这两个地址空间,因此所有连接的设备都必须映射到这两个地址空间。因此,这实际上与其说是 PCI 的限制,不如说是系统其余部分架构的限制。

我还应该提到,在开发 PCI 时,没有 IOMMU 这样的东西,这是一个相对较新的附加功能。

相关内容