Установить память как не кэшируемую через таблицу PAT x86 - PullRequest
9 голосов
/ 09 февраля 2012

Я хочу установить диапазон памяти как не кэшируемый (Linux, x86-86) из процесса пользовательского пространства. Этот вопрос подходит близко, но упоминает только регистры MTRR, которые работают с физической памятью. Я хочу сделать это с помощью таблиц PAT, поскольку они предлагают более детальный контроль, они позволяют устанавливать не кэшируемую виртуальную память постранично.

Документация Linux, Documentation / x86 / pat.txt , предполагает, что должно быть что-то с mmap и флагом SYNC, но я не могу найти, как это сделать на практике. В идеале я хотел бы использовать такой вызов, как mprotect(address, range, O_UNCACHABLE).

Ответы [ 2 ]

3 голосов
/ 18 октября 2012

Я бы рекомендовал написать модуль ядра, чтобы обеспечить необходимый интерфейс для процесса на уровне пользователя. Внутри модуля ядра вы можете использовать set_memory_uc для управления атрибутами страницы.

Относительно симулятора: он должен быть примерно в десять-тысячу раз медленнее, а не в миллион раз, если вы не симулируете на уровне ворот. Не забудьте подумать, сколько времени вам понадобится для написания модуля ядра. Если на написание и отладку модуля у вас уходит несколько недель, вам лучше воспользоваться симулятором для одноразового эксперимента.

0 голосов
/ 18 октября 2012

Согласно различным вопросам разработчиков на платформах ARM код будет:

fd = open("/dev/mem", O_RDWR|O_SYNC);
uptr = mmap(addr, length, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_LOCKED, fd, off);

ссылка:

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