PCIe中的地址空间


19

PCI Express中有四个地址空间:

  • 内存映射
  • I / O映射
  • 配置空间
  • 信息

谁能解释一下每个地址空间的意义及其目的吗?

据我了解,所有这些空间都分配到RAM(即处理器的内存)中。配置空间是分配给公用寄存器集(存在于所有PCIe设备中)的空间。所有PCIe设备之间是否都存在这个空间?以及它对PCIe功能操作有什么用?

该空间包含BAR(基址寄存器)。该寄存器是否用于指定PCIe端点中可用的地址?

我是PCIe的新手,正在尝试学习它。我指的是基本规范,但是我认为它是为具有PCI和PCIe知识的读者编写的。

另外,请参考一些免费的在线参考资料,以加快对基本规范的理解。我知道,只要有根复合体连接的任何PCIe设备都会被分配一些内存区域。

Answers:


31

自问这个问题已经有一段时间了,但是我讨厌孤立的问题:)

首先,让我们过度简化一个现代的x86平台,并假设它具有从0x00000000到0xFFFFFFFF的32位地址空间。我们将忽略所有特殊/保留区域,TOLUD(较低可用DRAM的顶部,Intel说法)孔等。我们将其称为系统内存映射

其次,PCI Express 扩展了 PCI。从软件的角度来看,它们非常相似。

首先,我将跳到您的第3个- 配置空间。指向配置空间的所有地址都是从系统内存映射中分配的。PCI设备的配置空间为256字节-PCI Express扩展为4KB。这4KB的空间消耗了系统内存映射中的内存地址,但是实际值/位/内容通常在外围设备的寄存器中实现。例如,当您读取供应商ID或设备ID时,即使使用的内存地址来自系统内存映射,目标外围设备也将返回数据。

您说这些是“分配到RAM中的”-不是,实际的位/有状态元素在外围设备中。但是,它们被映射到系统内存映射中。接下来,您询问它是否是所有PCIe设备上通用的寄存器集-是和否。PCI配置空间的工作方式,每个部分的末尾都有一个指针,指示是否还有更多的“东西”要读取。所有PCIe设备都必须实现最低限度,然后更高级的设备可以实现更多。至于它对功能操作的有用性,它是强制性的并且被大量使用。:)

现在,您关于BAR(基地址寄存器)的问题是一个可以隔离到内存空间和I / O空间的好空间。由于是以x86为中心的,因此该规范允许除了类型之外还指定BAR大小。这允许设备请求常规的内存映射BAR或IO空间BAR,这会占用x86机器拥有的4K I / O空间。您会注意到,在PowerPC机器上,I / O空格键毫无用处。

BAR基本上是设备告诉主机它需要多少内存以及什么类型(上面讨论过)的方式。如果我要求说1MB的内存映射空间,BIOS可能会将地址0x10000000分配给我0x10100000。这不是在消耗物理​​RAM,而是在消耗地址空间(您现在知道为什么32位系统会遇到扩展卡(例如具有GB RAM的高端GPU)的问题吗?)。现在,将写/读为0x10000004的内存发送到PCI Express设备,该内存可能是连接到LED的字节宽寄存器。因此,如果我将0xFF写入物理内存地址0x10000004,则将打开8个LED。这是内存映射I / O的基本前提。

I / O空间的行为类似,只是它在单独的内存空间x86 I / O空间中运行。地址0x3F8(COM1)在I / O空间和内存空间中都存在,并且是两个不同的事物。

最后一个问题,消息是指一种新型的中断机制,即消息信号中断或简称MSI。传统PCI设备具有四个中断引脚,即INTA,INTB,INTC,INTD。这些通常在插槽中交错,因此INTA进入插槽0的INTA,然后进入插槽1的INTB,然后进入插槽2的INTC,然后进入插槽3的INTD,然后回到插槽4的INTA。原因是大多数PCI这些设备仅实现了INTA,并且通过搅动它(具有三个设备),每个设备最终都会将自己的中断信号发送给中断控制器。MSI只是使用PCI Express协议层发出中断信号的一种方式,而PCIe根联合体(主机)负责中断CPU。

这个答案可能为时已晚,无法为您提供帮助,但可能会对将来的Googler / Binger有所帮助。

最后,我建议您先阅读一下英特尔的这本书,以获得对PCIe的良好而详尽的介绍,然后再继续进行。另一个参考文献是LWN的在线电子书Linux设备驱动程序》


该帖子非常有帮助。我是PCIe的新手,要进行枚举过程(配置空间分配和映射),我们需要驱动程序支持,还是可以由Os启动。
kamlendra '16

谢谢,很高兴它有所帮助!通常,在x86平台上,BIOS软件会根据从PCI设备解析的配置空间信息来进行一定数量的内存分配。现代操作系统通常会按原样接受此内存映射AFAIK,尽管它们也会检查并枚举设备以加载适当的驱动程序。我记得在Linux上看到过一些有趣的低级内容,它们可能使您有可能更改BIOS分配的内容。
克鲁纳·德赛

注意,只有标记为可预取的内存才能在每个事务中传输多个DWORD。所有其他空间可以传输只有每笔交易的一个DWORD。突发大小限制为MAX_PAYLOAD_SIZE(在枚举过程中发现)。
彼得·史密斯

你好。我是PCI的新手,希望对您的回答有所澄清。您声明将256b / 4k字节的配置空间映射到系统内存中。从我的自学开始,我认为对配置空间的访问是通过PCI控制器处理的,该控制器静态映射到系统内存中。该控制器提供了一些寄存器(用于设备/功能标识,偏移到地址空间,结果地址),这些寄存器用作配置空间的小接口。因此,实际上,仅为PCI控制器静态保留了大约5-10个字节。这是正确的吗 ???
Cerezo

因此,当主机(CPU)向地址0x10000004的寄存器写入值0xFF时,PCI根联合体将获取此数据(也许总是在从0x10000000到0x10100000的任何地址上轮询数据)并将其写入地址端点(PCIe设备)为0x04?这种理解正确吗?
AlphaGoku
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.