如何使用 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 位字重叠的计数器。
我想制作一个读取 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 位字重叠的计数器。