fre*_*eed 2 peripherals io cpu-architecture pci-bus pci
我正在研究 PC 架构,但觉得我没有掌握 PCI 地址的基础知识。
PCI中有三个地址空间:内存、输入输出端口和配置。我知道 CPU 可以使用不同的命令区分内存和端口,但是在 PCI 中会发生什么?我们在总线上有几个命令(读/写这些空间,中断处理等)。我认为在读取内存空间时,我们寻址到物理 RAM 地址,但在阅读了一些手册后,看起来我们寻址的是内部设备的内存。
除了 PCI 规范定义的 256 字节配置空间之外,还有自己的内存(在端点设备本身上)的 PCI 端点设备。必须将此内存带入系统地址空间,以便系统访问它。有两种方法可以将此内存带入系统地址空间 -
端口映射 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配置空间访问”机制,即使用Port 0xCFC & 0xCF8访问配置空间,然后BIOS设置End point请求的MMIO范围设备。
注意:当我们说“物理地址空间”时,它意味着 CPU 可以访问的地址范围。例如,64 位处理器最多可以有 2^64 = 16EB(取决于正在使用的地址线),这是巨大的地址范围。“物理地址空间”并不意味着它在 RAM 内的地址范围。
注意:PCI-SIG(PCI - Special Interest group)的 PCI Express 规范建议不要实现 IO 地址空间,IO 地址空间可能会在未来的 PCIe 修订版/规范中完全删除。
| 归档时间: |
|
| 查看次数: |
4721 次 |
| 最近记录: |