PCIe从入门到精通
+ -

PCIe 从入门到精通之九:利用 lspci 和 PCIe 设备的 ID 查看配置空间

2026-04-02 0 0

0. 引言

在《PCIe 从入门到精通之七:PCIe 设备的配置空间简介》中我们大体上介绍了 PCIe 设备的配置空间;在《PCIe 从入门到精通之八:PCIe 设备的身份证 ID》中介绍了 PCIe 设备的身份证 ID。

介绍了这么多理论,朋友们一定会说,你教的都是些没用的东西,不能学以致用。下面我们通过实战来解决下面两个问题:

  1. 有什么命令可以查看 PCIe 设备的身份证 ID 和配置空间?
  2. 将 PCIe 设备的身份证 ID 和配置空间显示出来后它们是什么样子的?

所有 PCIe 主题的文章都会收录在《深入浅出聊 PCIe》合集里,欢迎评阅。

需要下载 PCIe 学习资料标准的朋友(pdf 格式),请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。


1. 查看 PCIe 设备的身份证 ID

1.1 Windows 下如何查看 PCIe 设备的身份证 ID

使用设备管理器(Device Manager),这是最直观和常用的方法。

  1. 打开设备管理器。可以通过在运行(Win + R)中输入 devmgmt.msc 并按回车键来打开设备管理器
  2. 找到你想要查看的 PCIe 设备。这些设备通常在“显示适配器”、“网络适配器”或其他类别下
  3. 右键点击该设备,然后选择“属性”
  4. 在属性窗口中,切换到“详细信息”选项卡
  5. 在“属性”下拉菜单中,选择“位置信息(Location Information)”

此时,你将看到设备的 Bus Number、Device Number 和 Function Number,格式通常为 PCI bus X, device Y, function Z

如下图所示,图中的网卡的 PCIe 设备 ID 是:Bus 9, Device 0, Function 0

Windows设备管理器查看PCIe设备ID

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,大家可以自己按图索骥。

PCIe设备树结构


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。

PCIe配置空间结构

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 的数据

标准配置空间 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 配置空间的访问方式详解》

0 篇笔记 写笔记

关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!