2

我正在研究 PC 体系结构,但觉得我没有掌握 PCI 地址的基础知识。

我们在 PCI 中有三个地址空间:内存、输入输出端口和配置。我知道 CPU 可以使用不同的命令区分内存和端口,但是 PCI 会发生什么?我们在总线上有几个命令(读/写这些空间,中断处理等)。我认为在读取内存空间时,我们会寻址到物理 RAM 地址,但在阅读了一些手册之后,看起来我们寻址的是内部设备的内存。

  1. 为什么要使用内存映射?这是否意味着当某些程序写入映射到某个 PCI 设备的 RAM 地址时,它实际上会写入设备内存?为什么不使用标准 IO 端口写入?
  2. 如果需要,如何访问真实内存?例如,如果设备要在 RAM 中存储一些数据,那么这个请求将如何与“内存空间”访问区分开来?
4

2 回答 2

6

一个 PCI 端点设备,除了 PCI 规范定义的 256 字节配置空间外,它有自己的内存(在端点设备本身上)。必须将此内存带入系统地址空间才能允许系统访问它。有两种方法可以将此内存带入系统地址空间 -

  1. 端口映射 IO - 用于访问 IO 设备的地址空间,将通过特殊指令 IN & OUT(在 x86 上)进行访问。x86 使用 0xCFC(配置数据端口)和 0xCF8(配置地址端口)来访问 PCI 端点设备。

  2. 内存映射 IO - 为内存映射区域保留的物理地址空间区域将由 LOAD 和 STORE 等内存指令访问。对该 MMIO 区域的访问将针对关联的端点设备。

因此,当一条指令从处理器中出来时,它要么进入内存,要么是一个 IO 操作。在系统中,我们的 IO 地址空间非常有限(x86 机器为 64KB),但物理地址空间非常大。通过端口映射的 IO 访问 PCI 端点设备也相对较慢,因为它需要更多的 CPU 周期。访问内存更快,因为它需要更少的 CPU 周期数,因此 MMIO 是比端口映射 IO 更好的方法。

注意:在枚举过程中,BIOS 必须访问设备的配置空间来进行初始化。此时PCI中只有一种方式访问​​设备,称为“PCI配置空间访问”机制,使用端口0xCFC和0xCF8访问配置空间,然后BIOS设置端点请求的MMIO范围设备。

注意:当我们说“物理地址空间”时,它是指 CPU 可以访问的地址范围。例如,一个 64 位处理器最多可以有 2^64 = 16EB(取决于正在使用的地址线),这是一个巨大的地址范围。“物理地址空间”并不意味着它在 RAM 内的地址范围。

注意:PCI-SIG(PCI - Special interest group)的 PCI Express 规范建议不要实现 IO 地址空间,IO 地址空间可能会在未来的 PCIe 修订/规范中完全删除。

于 2018-08-26T14:03:50.020 回答
2

不要将内存地址视为“RAM 地址”。RAM 占用的内存空间是 CPU 总地址空间的一小部分。内存地址空间的剩余部分用于 MMIO,包括 PCI 设备。处理器对这些地址的任何 CPU 访问都将路由到相应的设备寄存器。

彼得关于使用 MMIO 原因的回答是正确的:I/O 指令是序列化的,而 CPU 内的内存访问是高度优化的,因此访问内存空间的开销比访问 I/O 空间的开销要少得多。

设备访问内存空间 (DMA) 的路由方式与 CPU 访问类似——如果访问在 RAM 的内存地址空间范围内,则访问路由到 RAM,如果访问在地址空间范围内另一个设备,它被路由到该设备。

于 2018-05-27T22:52:07.783 回答