为什么 PCIe 端点中有 6 个基地址寄存器 (BAR)?

Why there are 6 Base Address Registers (BARs) in PCIe endpoint?

在阅读了一些有关 PCIe 的资料后,我了解了 PCI 兼容配置 headers,在理解了 header 之后,我发现了基地址寄存器 (BAR) 字段。每个 PCIe 端点中共有 6 个 BAR。为什么有 6 个 BAR 而不仅仅是 2 个(1 个用于 32 位地址,2 个用于 64 位地址)。我的意思是所有 BAR 的详细功能是什么?

BAR 的使用因设备而异。它们用于设备控制操作(这是通常的情况)或用于数据传输 to/from 设备。有六个插槽的原因是允许设备为不同的目的提供不同的区域。此外,由于接口支持 64 位地址 spaces,提供其中之一需要 64 位 BAR(这需要两个连续的 32 位插槽)来配置基地址。

可以在 Intel i350 Ethernet Controller 的数据表中查看 BAR 用法的一个示例。参见第 9.4.11 节。此设备中有 3 个 BAR:一个用于内存映射设备配置(和访问 FLASH 设备),一个用于通过 I/O 地址 space 进行设备配置,一个用于配置 MSI-X 中断向量.

其他设备可能有一个或五个 BAR(或者 none 如果设备是网桥)。如果您是 运行 linux,请在您的系统上尝试 sudo lspci -vv 以观察设备之间的差异。