Ответ 1
При входе в защищенный режим регистр CR3 указывает на "каталог страниц" (вы можете поместить его куда угодно, прежде чем войти в защищенный режим), который является страницей памяти (помните, что "маленькая" страница - 4 KiB, а "большая" страница - 4 MiB) с записями на 1024 страницы (PDE), которые указывают на "таблицы страниц". Каждая запись - это первые 10 бит указателя (адрес таблицы страниц), плюс множество флагов, которые составляют нижнюю часть указателя (настоящее, разрешение, грязное и т.д.).
(1024 просто происходит из-за того, что страница составляет 4096 байт, а указатель - 4 байта.)
Каждая "таблица страниц" сама по себе составляет 1024 "записей в таблице страниц" (PTE), которая, опять же, содержит 1024 записи, указывающие на физические страницы в памяти вместе с кучей (почти одинаковых) флагов.
Итак, чтобы перевести 32-разрядный виртуальный адрес, вы берете верхние 10 бит указателя как индекс в таблицу в CR3 (так как есть две записи 10) и - если этот PDE далее подразделяется (это означает, что это не "большая" страница, которую вы можете определить из флагов) - вы берете верхние 20 бит PDE, просматриваете таблицу страниц по этому адресу и индексируете в него с виртуальным адресом следующие самые верхние 10 бит. Затем верхние 20 бит ссылаются на физическую страницу, предполагая, что нижние 12 бит говорят вам, что физическая страница действительно присутствует.
Если вы используете расширение физического адреса (PAE), вы получите еще один уровень в иерархии в самом верхнем.
Примечание: для вашего собственного здравомыслия (и, возможно, для процессора) вы, вероятно, захотите сопоставить каталог страниц и таблицу страниц для себя, в противном случае все будет запутываться быстро.:)
TLB управляется аппаратным обеспечением - поэтому кэширование таблиц страниц прозрачно - но есть команда InvlPG, которая делает недействительным PTE в TLB для вас. (Я не знаю точно, когда вы должны использовать его, а когда не стоит).
Источник: http://wiki.osdev.org/Paging