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.
答案 0 :(得分:3)
一个PCI端点设备,除了PCI规范定义的256字节的配置空间外,它还具有自己的内存(在端点设备本身上)。必须将该内存放入系统地址空间,以允许系统对其进行访问。可以通过两种方式将此内存带入系统地址空间-
端口映射的IO-用于访问IO设备的地址空间,将通过特殊指令IN&OUT(在x86上)进行访问。 x86使用0xCFC(配置数据端口)和0xCF8(配置地址端口)访问PCI端点设备。
内存映射的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,如果访问位于地址空间范围的另一个设备,它被路由到该设备。