Перевод страницы раздела кода процесса в Linux.Почему запись таблицы страниц получает 0 для некоторых страниц? - PullRequest
1 голос
/ 31 октября 2011

По какой-то причине мне нужно перевести виртуальный адрес раздела кода в физический адрес.Я сделал следующий эксперимент:

  1. Я получаю виртуальный адрес из start_code и end_code в mm_struct процесса A, которые являются начальным адресом и конечным адресом исполняемого кода.

  2. Я получаю CR3 процесса A.

  3. Я перевожу виртуальный адрес на физический адрес страницу за страницей.Например, есть 10 страниц для раздела кода в процессе А. Я переведу 10 виртуальных адресов каждого начала страницы.

  4. Я обнаружил, что некоторые страницы получат запись таблицы страниц (PTE) == 0. Некоторые страницы могут успешно преобразоваться в физический адрес.

  5. Я использовал Firefox и Minicom в качестве моего Процесса, и они оба окажутся в ситуации.

Наверное, мой вопрос: кто-нибудь может объяснить мне, почему PTE == 0?Значит ли это, что эти страницы были выгружены на диск?Если это так, как я могу найти эти страницы?

Спасибо за любой вклад !!

1 Ответ

2 голосов
/ 03 ноября 2011

Похоже, что вы пытаетесь выполнить самоанализ таблицы страниц, не используя для этого API-интерфейсы ядра.Обратите внимание, что адресное пространство организовано в красно-черном дереве структур vm_area_struct, и вам, вероятно, следует использовать API-интерфейсы, которые их пересекают.Отображения могут измениться в любое время, поэтому необходимо использовать правильную блокировку для этих структур данных.

Например, см. Функцию get_user_pages ().Его можно использовать для замены и временного закрепления страниц в памяти.Использование этой функции для самоанализа таблицы страниц обычно запрашивается, поскольку, если у вас есть физический адрес, ядро ​​может поменять страницу в любое время.

...