lspci“Memory at …”vs / proc / bus / pci / devices BAR地址

我有一个用户空间应用程序,我用它来写入一个PCI设备的寄存器。 它将设备的基本内存地址作为参数。 我不想通过每个平台上的lspcilspci ,而是想写一个bash脚本来使用供应商/设备ID来查找基地址,然后调用应用程序。

让我们以设备ID为“0891”的英特尔networking控制器为例。 这是在一个Ubuntu的盒子,但我需要它在不同的Linux发行版上工作。

我想只是用这样的parsinglspci的输出:

 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,可以跨分配使用?

从我可以确定的格式0x 000 0004传达一些额外的信息。 位2指示BAR是1 = 64位,0 = 32位地址,位3指示存储区域是1 =可预取,0 =不可预取。