如何通过总线,设备,功能和偏移量获取物理地址

时间:2018-11-13 14:14:20

标签: linux linux-kernel pci

我想制作一个读取DRAM计数器的内核模块,以获取从DRAM(https://software.intel.com/en-us/articles/monitoring-integrated-memory-controller-requests-in-the-2nd-3rd-and-4th-generation-intel)读取的数据数量。

在该页面上,他们说

  

“ BAR在总线0;设备0;功能0;偏移量048H上可用(在PCI配置空间中),而我想读取的UNC_IMC_DRAM_DATA_READS位于“ BAR + 0x5050”上。

这是否意味着我可以通过输入获得DRAM计数器的物理地址

    sudo setpci 00:00:0 48.L 

然后+ 0x5050获取UNC_IMC_DRAM_DATA_READS的地址?

实际上

    sudo setpci 00:00:0 48.L

输出

    fed10001

,然后我用busybox访问了0xfed15051。

    sudo busybox devmem 0xfed15051

但是,最左边的两个位(在0x00123456中表示“ 00”)始终为零。

出了什么问题,如何通过总线,设备,功能和偏移正确获取物理地址。

谢谢:)

1 个答案:

答案 0 :(得分:2)

低位是一个使能位,应从您使用的地址中排除。例如,请参见https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/xeon-e3-1200v6-vol-2-datasheet.pdf(第3.12页,第57页)-在此处记录为MCHBAREN标志。

本文档还提供了该技术说明中提到的相同寄存器的详细寄存器描述-从第7.43页第202页开始。

通常,对PCI寄存器的访问通常总是在32位(DWORD)边界上完成。您几乎永远找不到一个与32位字重叠的计数器。