PCIe 中的地址空间

电器工程 pcie
2022-01-23 08:28:34

PCI express 中有四个地址空间:

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

任何人都可以解释每个地址空间的重要性,以及它的目的吗?

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

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

我是 PCIe 的新手,正在努力学习它。我指的是基本规范,但我认为它是为对 PCI 和 PCIe 有一些先验知识的读者编写的。

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

1个回答

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

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

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

我会跳到你的第三个——配置空间——首先。任何指向配置空间的地址都是从系统内存映射中分配的。一个 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 毫无价值。

BAR 基本上是设备告诉主机它需要多少内存以及什么类型的方式(上面讨论过)。如果我要求 1MB 的内存映射空间,BIOS 可能会将地址 0x10000000 分配给 0x10100000。消耗物理 RAM,只消耗地址空间(你现在明白为什么 32 位系统会遇到扩展卡问题,比如具有 GB 内存的高端 GPU 吗?)。现在将向 PCI Express 设备发送内存写入/读取 0x10000004,这可能是连接到 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。

最后,我建议您阅读Intel 的这本书,以便在您进一步了解 PCIe 之前获得良好、详细的介绍。另一个参考资料是Linux 设备驱动程序,这是 LWN 的在线电子书