Io 理解PCI地址映射

Io 理解PCI地址映射,io,cpu-architecture,pci,peripherals,pci-bus,Io,Cpu Architecture,Pci,Peripherals,Pci Bus,我正在研究PC架构,觉得我没有掌握PCI地址的基本原理 PCI中有三个地址空间:内存、输入输出端口和配置。我知道CPU可以使用不同的命令区分内存和端口,但PCI会发生什么?总线中有几个命令(读/写这些空间、中断处理等)。我认为,在读取内存空间时,我们将地址设置为物理RAM地址,但在阅读了一些手册之后,我们似乎将地址设置为内部设备的内存 为什么要使用内存映射?这是否意味着当一些程序写入映射到某个PCI设备的RAM地址时,它实际上会写入设备内存?为什么不使用标准IO端口写入 如果需要,如何访问真实内

我正在研究PC架构,觉得我没有掌握PCI地址的基本原理

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

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

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

    Peter关于使用MMIO的原因的回答是正确的:I/O指令是串行化的,而CPU内的内存访问是高度优化的,因此访问内存空间的开销比访问I/O空间的开销小得多


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

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

  • 端口映射IO—用于访问IO设备的地址空间,将通过特殊指令输入和输出(在x86上)进行访问。x86使用0xCFC(配置数据端口)和0xCF8(配置地址端口)访问PCI端点设备

  • 内存映射IO—为内存映射区域保留一个物理地址空间区域,该区域将被加载和存储等内存指令访问。对该MMIO区域的访问将针对相关的端点设备

  • 因此,当一条指令从处理器出来时,它要么进入内存,要么是一个IO操作但物理地址空间非常大。此外,通过端口映射IO访问PCI端点设备的速度相对较慢,因为它需要更多的CPU周期。访问内存的速度更快,因为它需要更少的CPU周期,因此MMIO是一种比端口映射IO更好的方法

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

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


    注:PCI-SIG的PCI Express规范(PCI-特殊利益集团)建议不要实现IO地址空间,在未来的PCIe版本/规格中,IO地址空间可能会被完全删除。

    内存映射I/O更有效,因为CPU可以将其管道化。
    in
    /
    out
    指令正在序列化,IIRC。我没有经验对其余问题给出一个好的答案打开。RAM占用的内存空间只占CPU总地址空间的一小部分,除非您使用RAM(例如128TiB或256TiB)完全加载服务器,在这种情况下,您可以使用DRAM填充所有物理地址空间,最多可达该CPU中实现的物理地址位数。页表格式最多可支持52位物理地址(),但当前CPU的实现刚好满足可用DRAM密度的要求。请注意,
    in
    out
    并没有正式归类为“序列化”,但它们具有相同的效果:像
    锁定
    ed指令一样的完整内存屏障,以及直到“数据阶段”之后才能开始执行的后续指令。PCI是否类似于DMA?它计算出地址,然后将数据发送到端点。因此,当主机写入映射到端点的地址时,PCI根复合体会识别该地址,并将数据路由到端点中适当的偏移地址?