我有一个用户空间应用程序,用于写入 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=不可预取。