如何使用 Bus、Device、Function 和 Offset 获取物理地址

How to get the physical address with Bus, Device, Function, and Offset

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

在那个页面上,他们说

"The BAR is available (in PCI configuration space) at Bus 0; Device 0; Function 0; Offset 048H", and UNC_IMC_DRAM_DATA_READS, which I want to read, is on "BAR + 0x5050".

是否意味着我可以通过键入

来获取DRAM Counter的物理地址
    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”,始终为零。

哪里出了问题,如何使用总线、设备、函数和偏移量正确获取物理地址。

谢谢:)

低位是启用位,应从您使用的地址中排除。例如,参见 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 位字重叠的计数器。