PCIe 从入门到精通之九:利用 lspci 和 PCIe 设备的 ID 查看配置空间
0. 引言
在《PCIe 从入门到精通之七:PCIe 设备的配置空间简介》中我们大体上介绍了 PCIe 设备的配置空间;在《PCIe 从入门到精通之八:PCIe 设备的身份证 ID》中介绍了 PCIe 设备的身份证 ID。
介绍了这么多理论,朋友们一定会说,你教的都是些没用的东西,不能学以致用。下面我们通过实战来解决下面两个问题:
- 有什么命令可以查看 PCIe 设备的身份证 ID 和配置空间?
- 将 PCIe 设备的身份证 ID 和配置空间显示出来后它们是什么样子的?
所有 PCIe 主题的文章都会收录在《深入浅出聊 PCIe》合集里,欢迎评阅。
需要下载 PCIe 学习资料标准的朋友(pdf 格式),请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。
1. 查看 PCIe 设备的身份证 ID
1.1 Windows 下如何查看 PCIe 设备的身份证 ID
使用设备管理器(Device Manager),这是最直观和常用的方法。
- 打开设备管理器。可以通过在运行(Win + R)中输入
devmgmt.msc并按回车键来打开设备管理器 - 找到你想要查看的 PCIe 设备。这些设备通常在“显示适配器”、“网络适配器”或其他类别下
- 右键点击该设备,然后选择“属性”
- 在属性窗口中,切换到“详细信息”选项卡
- 在“属性”下拉菜单中,选择“位置信息(Location Information)”
此时,你将看到设备的 Bus Number、Device Number 和 Function Number,格式通常为 PCI bus X, device Y, function Z。
如下图所示,图中的网卡的 PCIe 设备 ID 是:Bus 9, Device 0, Function 0。

1.2 Linux 下如何查看 PCIe 设备的身份证 ID
在 Linux 下查看 PCIe 设备的 Bus Number、Device Number 和 Function Number(BDF),lspci 是最常用和推荐的工具。使用 lspci 命令,输出通常会以 BB:DD.F 的格式显示设备的 BDF 地址。
$ lspci
00:00.0 Host bridge: Intel Corporation 8th Gen Core Processor Host Bridge/DRAM Registers (rev 07)
00:02.0 VGA compatible controller: Intel Corporation CoffeeLake-H GT2 [UHD Graphics 630]
00:08.0 System peripheral: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Gaussian Mixture Model
00:14.0 USB controller: Intel Corporation Cannon Lake PCH USB 3.1 xHCI Host Controller (rev 10)
00:14.2 RAM memory: Intel Corporation Cannon Lake PCH Shared SRAM (rev 10)
00:15.0 PCI bridge: Intel Corporation Cannon Lake PCH SPI Controller (rev 10)
00:16.0 Communication controller: Intel Corporation Cannon Lake PCH HECI Controller (rev 10)
00:17.0 SATA controller: Intel Corporation Cannon Lake PCH SATA AHCI Controller (rev 10)
...
在上面的例子中:
- 第一个设备
00:00.0 Host bridge表示 Bus number = 0、device number = 0、function number = 0 的 host bridge - 其他的 PCIe 设备依次类推
下图是一个 PCIe tree,按照图中的示例可以从中找出各个 device 的 bus number、device number 和 function number,大家可以自己按图索骥。

2. 如何查看 PCIe 设备的配置空间
先回忆一下 PCIe 设备配置空间的结构:
PCI Express 配置空间被划分为:
- PCI 兼容配置空间(PCI Compatible Configuration Space):前 256 字节(Byte 0h ~ FFh)
- PCIe 扩展配置空间(PCIe Extended Configuration Space):Byte 100h ~ FFFh(总计 4KB)
在 PCI 兼容配置空间里:
- 前 0h ~ 3Fh:存放的是 PCI Header(设备基本信息)
- 后面的 40h ~ FFh:存放的是 PCIe Capability Structure(设备具备的能力)
在扩展配置空间里(Byte 100h ~ FFFh):全部存放的是 PCIe Extended Parameters and Capability Structure。

2.1 Windows 下如何查看 PCIe 设备的配置空间
在 Windows 下直接查看 PCIe 设备的配置空间(Configuration Space)不像在 Linux 下那样直接通过 lspci -xxxx 或 sysfs 文件系统那样方便。
Windows 操作系统出于安全和系统稳定性的考虑,对底层硬件的直接访问进行了严格的抽象和限制。普通用户和应用程序通常无法直接读取或写入 PCIe 设备的配置空间寄存器。可以通过第三方工具实现。
2.2 Linux 下如何查看 PCIe 设备的配置空间
查看原始十六进制配置空间
命令格式:lspci -s BusID:DeviceID.FunctionID -xxx
1) 标准配置空间 0x000-0x0FF 的数据

以后我们将用上面这张图来详细介绍各个寄存器的含义。
2) 扩展配置空间 0x100-0xFFF 的数据示例
$ lspci -s 0000:01:00.0 -xxxx
... (前面是标准配置空间 0x000-0x0FF 的数据)
下面是扩展配置空间 0x100-0xFFF 的数据示例:
00000100: 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000160: 1b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000001a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000001b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000001c0: 23 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
... (一直到 0xFF0 偏移量)
3. 抛砖引玉
我们可以通过命令来显示 PCIe 配置空间的值,那么:
- PCIe 设备的配置空间的这些值是怎么从 PCIe 设备里被读取到 Host OS 的?
- 可以通过什么方式来读写?
- 具体的读写流程是怎样的?
敬请关注下一篇:
《PCIe 从入门到精通之十:PCIe 配置空间的访问方式详解》
PCIe从入门到精通





