4. lspci 工具详解:常用参数与输出字段解析

lspci 是 Linux 下最核心的 PCI/PCIe 设备枚举与诊断工具,它直接读取 /sys/bus/pci/devices 和 /proc/bus/pci 中的配置空间数据,并以可读格式输出。掌握 lspci 的常用参数和输出字段,是调试 PCIe 驱动、排查设备枚举失败、配置空间访问异常的第一步。

调试提示: 在嵌入式或服务器环境中,如果 lspci 输出为空或报错,通常意味着 PCIe 控制器未初始化、RC(Root Complex)枚举失败或设备未上电。此时应优先检查 dmesg | grep pci 和 lspci -vv 的详细状态。

4.1 lspci 常用参数速查表

参数 功能描述 典型使用场景
-v Verbose 模式,显示设备名称、驱动、资源、IRQ 等基本信息 快速查看设备功能与驱动绑定
-vv 更详细的 Verbose 模式,显示 Capability 列表、LnkCap/LnkSta 等 排查链路协商状态、电源管理能力
-x 以十六进制显示前 64 字节标准配置空间 验证 Vendor ID、Device ID、Class Code
-xxx 显示全部 256 字节配置空间(需 root) 调试扩展配置空间、Capability 结构
-s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]] 按 BDF(Bus:Device.Function)过滤指定设备 精确定位某个 PCIe 设备
-t 以树形拓扑显示 PCIe 总线层级 可视化 PCIe 交换拓扑、Root Port 连接关系
-k 显示内核驱动与内核模块 确认设备是否被正确驱动加载
-D 显示 PCI domain(多域系统) 多 Root Complex 或 NUMA 系统

4.2 输出字段深度解析

以 lspci -vv -s 01:00.0 为例,逐段解析关键字段含义:

01:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
        Subsystem: Intel Corporation I350 Gigabit Network Connection
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 64 bytes
        Interrupt: pin A routed to IRQ 47
        Region 0: Memory at f7c00000 (32-bit, non-prefetchable) [size=512K]
        Region 2: I/O ports at f020 [size=32]
        Expansion ROM at f7c80000 [disabled] [size=256K]
        Capabilities: [40] Power Management version 3
        Capabilities: [50] MSI: Enable+ Count=1/1 Maskable- 64bit+
        Capabilities: [70] MSI-X: Enable+ Count=10 Masked-
        Capabilities: [a0] Express (v2) Endpoint, MSI 00
                DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s <512ns, L1 <64us
                DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend-
                LnkCap: Port #0, Speed 5GT/s, Width x4, ASPM L0s L1, Exit Latency L0s <1us
                LnkSta: Speed 5GT/s (ok), Width x4 (ok)
        Kernel driver in use: igb
        Kernel modules: igb
字段速查表:
  • BDF (01:00.0) — Bus:Device.Function,PCIe 硬件寻址坐标。
  • Control/Status — 配置空间 Command/Status 寄存器解码,I/O+ 表示 IO 空间使能,Mem+ 表示内存空间使能,BusMaster+ 表示允许 DMA。
  • Interrupt — 中断引脚与 IRQ 号,MSI/MSI-X 使能时此处显示虚拟 IRQ。
  • Region 0..5 — Base Address Register (BAR),描述设备 MMIO/IO 空间基址与大小。
  • Capabilities — 能力链表,包含 PM、MSI、MSI-X、PCIe Express 等关键扩展。
  • LnkCap / LnkSta — 链路能力与状态,Speed 和 Width 是协商后的实际值,带 (ok) 表示链路正常。
  • Kernel driver in use — 当前绑定的内核驱动名称,为空表示无驱动。

4.3 实战:使用 -x / -xxx 查看配置空间原始字节

当驱动无法识别设备时,直接读取配置空间原始数据可以验证硬件是否返回正确的 Vendor ID 和 Device ID。

# 查看 01:00.0 的标准配置空间(前 64 字节)
$ lspci -x -s 01:00.0
01:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection
00: 86 80 21 15 07 04 10 00 01 00 00 02 10 00 00 00
10: 04 00 c0 f7 00 00 00 00 21 f0 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 86 80 21 15
30: 00 00 c8 f7 80 00 00 00 00 00 00 00 0b 01 00 00

# 查看全部 256 字节配置空间(需要 root)
$ sudo lspci -xxx -s 01:00.0
01:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection
00: 86 80 21 15 07 04 10 00 01 00 00 02 10 00 00 00
10: 04 00 c0 f7 00 00 00 00 21 f0 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 86 80 21 15
30: 00 00 c8 f7 80 00 00 00 00 00 00 00 0b 01 00 00
40: 01 50 03 00 00 00 00 00 00 00 00 00 00 00 00 00
50: 05 70 83 01 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 11 a0 0a 00 00 00 00 00 00 00 00 00 00 00 00 00
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 02 e0 02 00 01 00 00 00 00 00 00 00 00 00 00 00
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
注意: 偏移 0x00 处前两个字节为 Vendor ID(0x8086 = Intel),偏移 0x02 处两个字节为 Device ID(0x1521 = I350)。如果读取到 0xFFFF,表示设备不存在或配置空间访问失败。

4.4 实战:使用 -t 查看 PCIe 拓扑树

lspci -t 以缩进树形结构展示 PCIe 总线层级,帮助理解设备挂载关系:

$ lspci -t
-[0000:00]-+-00.0  Intel Corporation 5520/5500/X58 I/O Hub to ESI Port
           +-01.0-[01-03]----00.0-[02-03]----00.0-[03]----00.0  Intel Corporation I350 Gigabit Network Connection
           +-03.0-[04]----00.0  NVIDIA Corporation GP102 [TITAN X]
           +-1c.0-[05-06]----00.0-[06]----00.0  Samsung Electronics NVMe SSD Controller
           +-1f.0  Intel Corporation 82801JI (ICH10 Family) LPC Interface Controller
           +-1f.2  Intel Corporation 82801JI (ICH10 Family) SATA AHCI Controller

解读:+-01.0-[01-03] 表示 Root Port 01.0 下挂载了二级总线 01~03,经过 PCIe 交换机后最终连接 I350 网卡。这种拓扑对调试 PCIe 链路训练失败 或 设备枚举顺序 非常有用。

4.5 配置空间字节布局与 lspci 输出对照

PCIe 标准配置空间布局与 lspci -x 输出对照 偏移 0x00 - 0x3F:标准配置空间头部 (64 字节) Vendor ID / Device ID Command / Status Class Code / Rev ID BAR 0 - BAR 5 (24 字节) lspci -x 输出示例: 00: 86 80 21 15 07 04 10 00 01 00 00 02 10 00 00 00 10: 04 00 c0 f7 00 00 00 00 21 f0 00 00 00 00 00 00 偏移 0x40 - 0xFF:扩展配置空间 (Capability 链表 + 设备特定) Capabilities: [40] Power Management Capabilities: [50] MSI Capabilities: [a0] Express Endpoint lspci -vv 对应输出: Capabilities: [40] Power Management version 3 Capabilities: [50] MSI: Enable+ Count=1/1 Maskable- 64bit+

4.6 实战案例:使用 -s 精确定位与过滤

在拥有多个 PCIe 域或大量设备的系统中,-s 参数可以精确过滤:

# 仅查看 domain 0000, bus 02, slot 00, function 0
$ lspci -s 0000:02:00.0

# 查看 bus 03 上的所有设备
$ lspci -s 03:

# 查看 slot 04 的所有 function
$ lspci -s 04.0

# 结合 -vv 查看指定设备的完整链路状态
$ lspci -vv -s 01:00.0 | grep -E "LnkCap|LnkSta"
                LnkCap: Port #0, Speed 5GT/s, Width x4, ASPM L0s L1, Exit Latency L0s <1us
                LnkSta: Speed 5GT/s (ok), Width x4 (ok)
调试技巧: 如果 LnkSta 显示 Speed 2.5GT/s 但 LnkCap 支持 5GT/s,说明链路协商降速,可能是信号完整性或 PCB 布线问题。如果 Width 显示 x1 但支持 x4,可能是金手指接触不良或 PCIe 交换机端口配置错误。

4.7 常见问题与排查思路

现象 可能原因 lspci 诊断命令
lspci 输出为空 PCIe 控制器未初始化、ACPI 未枚举 dmesg | grep -i pci
设备显示 "Unknown device" Vendor/Device ID 不在 pci.ids 数据库中 lspci -x -s <BDF> 查看原始 ID
LnkSta 显示 Speed 2.5GT/s PCIe Gen1 降速协商 lspci -vv -s <BDF> | grep Lnk
BAR 显示为 0 设备未使能内存/IO 空间 lspci -vv -s <BDF> | grep Region
Kernel driver in use 为空 无驱动绑定或驱动 probe 失败 lspci -k -s <BDF>

4.8 本章小结

  • -v / -vv 提供从基本信息到完整能力链表的逐级详情,是日常调试的主力参数。
  • -x / -xxx 直接读取配置空间原始字节,用于验证硬件 ID 和 Capability 结构。
  • -s 支持 BDF 精确过滤,-t 展示总线拓扑,两者结合可快速定位设备挂载关系。
  • 输出字段中的 LnkSta、BAR、Kernel driver 是判断设备是否正常工作的关键指标。