PCI Sysfs、Proc 与用户态控制接口
1. 设备目录
每个 Function 通常位于:
1 | /sys/bus/pci/devices/0000:bb:dd.f/ |
pci-sysfs.c创建主要属性,proc.c提供历史/proc/bus/pci接口。现代管理和诊断应优先使用 sysfs、libpci/lspci 及驱动专用接口。
2. 身份与拓扑属性
常见只读属性:
vendor、device;subsystem_vendor、subsystem_device;class、revision;irq;modalias;max_link_speed/width;current_link_speed/width;- 桥的
secondary_bus_number/subordinate_bus_number; numa_node、local_cpulist等拓扑信息。
modalias用于 udev/module loader 查找匹配模块,但最终仍由pci_bus_match()按 ID 表确认。
3. 配置空间
config是二进制属性,大小由设备配置空间决定,通常为 256 B 或 PCIe 4 KiB。读写权限受 capability、内核 lockdown 和文件 mode 限制。
直接写配置空间可能:
- 改写 BAR 导致资源树与硬件不一致;
- 关闭 Bus Master 或使能未知 DMA;
- 改变 AER/ASPM/链路状态;
- 破坏正在运行的驱动。
因此在线设备优先使用内核 API 或驱动接口,不把setpci作为永久配置方案。
4. BAR 与 ROM
resource:文本形式列出所有资源起止地址和 flags;resourceN:可 mmap 的 BAR 二进制文件;resourceN_wc:允许 write-combining 的变体;rom:Expansion ROM;resourceN_resize:Resizable BAR 控制,只有支持且安全时出现。
用户态 mmap BAR 不能绕过设备所有权。设备已绑定内核驱动时,并发访问私有寄存器可能破坏驱动状态。
5. 设备控制属性
enable
写 1/0通过 PCI Core 增减设备 enable 状态。它不是完整的驱动初始化/停机接口,不能代替 unbind、停止 DMA 和资源释放。
remove
写 1触发逻辑移除:
1 | pci_lock_rescan_remove() |
它不会物理断电,且桥设备移除会递归影响下游。
rescan
总线或设备 rescan 会重新读取配置空间并加入新 Function。前提是控制器、链路、电源已就绪。
reset
若设备存在安全 reset 方法,会出现reset属性。写入会触发功能复位,但不保证应用或驱动状态自动恢复。
driver_override
指定仅允许匹配某驱动名。它本身不会自动 unbind/rebind;常用于 VFIO,但必须同时完成 IOMMU group 和设备隔离检查。
6. 驱动绑定
1 | /sys/bus/pci/drivers/<driver>/ |
unbind调用当前驱动 remove;bind尝试绑定指定 BDF;new_id临时向驱动加入动态 PCI ID;- 动态 ID 不会让不兼容硬件突然兼容,错误绑定可能造成 MMIO/DMA 破坏。
7. SR-IOV
PF 设备可能暴露:
sriov_totalvfs;sriov_numvfs;sriov_drivers_autoprobe。
写sriov_numvfs会创建/删除 VF。删除前必须解绑或停止 VF 用户;资源不足时应检查 VF BAR 和桥窗口。
8. PCI Slot 与 Hotplug
Hotplug Core 在:
1 | /sys/bus/pci/slots/<slot>/ |
按后端能力提供power、attention、latch、adapter、test等属性。并非每个 BDF 都有物理 slot,也不是每个 M.2 连接器都支持软件控电。
9. /proc/bus/pci
CONFIG_PROC_FS下proc.c提供兼容枚举和配置访问。它主要服务历史 ABI;新代码不应依赖其目录布局来判断热插拔或设备所有权。
10. 常用诊断
1 | lspci -nn |
lspci展示配置空间快照;dmesg 展示内核过程;二者不能替代 PHY/clock/regulator 等平台状态检查。
11. 并发与权限
remove、rescan、bind/unbind、SR-IOV 和 reset 都是有破坏性的控制操作,应:
- 限制为管理员;
- 先停业务和 DMA;
- 串行化自动化脚本;
- 验证目标 BDF,避免桥级操作波及整棵子树;
- 不在不可信容器中暴露可写 PCI sysfs。
正在加载留言…