Как получить физический адрес с помощью шины, устройства, функции и смещения - PullRequest
0 голосов
/ 13 ноября 2018

Я хочу создать модуль ядра, который считывает счетчики DRAM, чтобы получить количество данных, считанных из DRAM (https://software.intel.com/en-us/articles/monitoring-integrated-memory-controller-requests-in-the-2nd-3rd-and-4th-generation-intel).

На этой странице они говорят:

"BAR доступен (в пространстве конфигурации PCI) на шине 0; устройство 0; функция 0; смещение 048H", а 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

, и я получил доступ к 0xfed15051 с busybox.

    sudo busybox devmem 0xfed15051

Однако два крайних левых бита, я имею в виду «00» в 0x00123456, всегданоль.

Что не так, и как я могу правильно получить физический адрес с помощью шины, устройства, функции и смещения.

Спасибо:)

1 Ответ

0 голосов
/ 13 ноября 2018

Младший бит является битом разрешения и должен быть исключен из используемого вами адреса. См., Например, 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-битные слова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...