Как я могу заставить страницу к ошибке, даже если она уже находится в TLB? - PullRequest
3 голосов
/ 10 августа 2011

Я пытаюсь написать оценщик рабочего набора игрушек, отслеживая ошибки страниц в течение определенного периода времени.Всякий раз, когда происходит сбой страницы, я хочу записать, что она была затронута.Схема ломается, когда я пытаюсь отслеживать доступ к уже существующим страницам.Если страница считывается или записывается без сбоев, у меня нет возможности отслеживать доступ.

Итак, я хочу иметь возможность вызвать «легковесную» ошибку при доступе к странице.В какой-то момент я слышал о каком-то методе, но я не понимал, почему он работал, поэтому он не запомнился мне.Грязный может быть?

Ответы [ 2 ]

3 голосов
/ 10 августа 2011

Вы можете использовать mprotect с PROT_NONE («Страница недоступна»). Тогда любой доступ к данной странице вызовет ошибку.

2 голосов
/ 10 августа 2011

Обычный способ сделать это - просто очистить бит «присутствует» для страницы, оставив страницу в памяти и необходимые структуры данных ядра на месте, чтобы ядро ​​это знало.

Однако, в зависимости от рассматриваемой архитектуры, у вас могут быть лучшие варианты - например, в x86 есть флаг «Доступ» (бит 5 в PTE), который устанавливается всякий раз, когда PTE используется в линейной трансляции адресов. Вы можете просто очистить этот бит, когда захотите, и аппаратные средства установят его так, чтобы он записывал, что страница была затронута.

Используя любой из этих методов, вам нужно очистить кэшированный перевод для этой страницы из TLB - на x86 вы можете использовать инструкцию INVLPG.

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