lspci “内存在......” vs /proc/bus/pci/devices BAR 地址

lspci “内存在......” vs /proc/bus/pci/devices BAR 地址

我有一个用户空间应用程序,用于写入 pci 设备的寄存器。它以设备的基内存地址作为参数。lspci我不想在每个平台上查找它,而是想编写一个 bash 脚本,使用供应商/设备 ID 来查找基地址并调用应用程序。

让我们使用设备 ID 为“0891”的英特尔网络控制器作为示例。这是在 Ubuntu 机器上,但我需要它在不同的 Linux 发行版上工作。

lspci我想到只是用这样的方式解析输出:

lspci -vn | grep -A 3 0891 | grep Memory | awk '{print $3}'

生成结果:

f0500000

但我感兴趣的是从文件系统的某个地方获取基地址,而不是依赖于另一个应用程序,因此我尝试:

cat /proc/bus/pci/devices | grep 0891 | awk '{print $4}'

得出的结果为:

f0500004

为什么第二个值偏移了4个字节?

附加问题:我可以从哪里获得 PCI 设备基内存地址,以便跨发行版工作而不依赖于其他应用程序(例如 lspci)?

答案1

据我所知,0x????0004 的格式传达了一些附加信息。位 2 表示 BAR 是 1=64 位、0=32 位地址,位 3 表示内存区域是 1=可预取、0=不可预取。

相关内容