Understanding PCI address mapping

时间:2016-06-18 20:00:44

标签: io cpu-architecture pci peripherals pci-bus

I'm studying PC architecture and feel that I'm not getting the fundamentals of PCI addresses.

We have three address spaces in PCI: memory, in-out ports and configuration. I know that CPU can distinguish between memory and ports using different commands, but what happens in PCI? We have several commands in bus (reading/writing to these spaces, interruption processing etc). I thought that when reading memory space we address to physical RAM address but after reading some manuals it looks like we address internal devices' memory.

  1. Why use memory mapping? Does it mean that when some program writes to RAM address mapped to some PCI device it actually writes to device memory? Why not use standard IO ports write?
  2. How to access real memory if needed? For example, if device wants to store some data in RAM, how this request will be distinguished from "memory space" access?

2 个答案:

答案 0 :(得分:3)

一个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-特殊利益集团)的PCI Express规范建议不要实现IO地址空间,在将来的PCIe修订/规范中,IO地址空间可能会完全删除。

答案 1 :(得分:2)

不要将内存地址视为" RAM地址"。 RAM占用的存储空间只占CPU总地址空间的一小部分。内存地址空间的其余部分用于MMIO,包括PCI设备。对这些地址的任何CPU访问都由处理器路由到适当的设备寄存器。

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

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