Как работают таблицы страниц x86?

Я знаком с архитектурой MIPS, которая имеет программно управляемый TLB. Так как и где вы (операционная система) хотите хранить таблицы страниц и записи таблицы страниц, полностью зависит от вас. Например, я сделал проект с одной перевернутой таблицей страниц; Я видел, как другие использовали двухуровневые таблицы страниц для каждого процесса.

Но что за история с x86? Из того, что я знаю, TLB управляется аппаратно. Говорит ли x86, в основном, что вы говорите: "Эй, это то место, где нужно использовать записи таблицы страниц, которые вы сейчас используете [диапазон физических адресов]"? Но подождите, я всегда думал, что x86 использует многоуровневые таблицы страниц, так что он скажет вам, где разместить первый уровень или что-то в этом роде... Я не совсем понимаю.

Спасибо за любую помощь.

1 ответ

Решение

При входе в защищенный режим регистр CR3 указывает на "каталог страниц" (вы можете поместить его в любое место, прежде чем войти в защищенный режим), который является страницей памяти (помните, что "маленькая" страница составляет 4 КиБ, и "большая" страница составляет 4 МБ) с 1024 записями каталога страниц (PDE), которые указывают на "таблицы страниц". Каждая запись - это первые 10 битов указателя (адрес таблицы страниц), а также набор флагов, которые составляют нижнюю часть указателя (присутствует, разрешение, грязный и т. Д.).

(1024 просто исходит из того факта, что страница занимает 4096 байт, а указатель - 4 байта.)

Каждая "таблица страниц" сама по себе является 1024 "записями таблицы страниц" (PTE), которая, опять же, содержит 1024 записи, которые указывают на физические страницы в памяти, вместе с кучей (почти одинаковых) флагов.

Итак, чтобы перевести 32-битный виртуальный адрес, вы берете первые 10 битов указателя в качестве индекса в таблицу на CR3 (так как есть 2 10 записей), и - если этот PDE подразделяется (это означает, что это не "большая" страница, которую вы можете определить из флагов) - вы берете 20 верхних бит PDE, ищите таблицу страниц по этому адресу и индексируете в ней следующие виртуальные адреса -topmost 10 биты. Затем самые верхние 20 бит отсылают вас на физическую страницу, предполагая, что нижние 12 бит говорят о том, что физическая страница действительно присутствует.

Если вы используете расширение физического адреса (PAE), то вы получите еще один уровень в иерархии на самом верху.

Примечание: для вашего собственного здравомыслия (и, возможно, для ЦП) вы, вероятно, захотите сопоставить каталог страницы и таблицу страниц с самим собой, иначе все быстро запутается.:)

TLB управляется аппаратно - поэтому кэширование таблиц страниц прозрачно - но есть инструкция InvlPG, которая делает недействительным PTE в TLB. (Я не знаю точно, когда вы должны его использовать, а когда нет.)

Источник: http://wiki.osdev.org/Paging

Другие вопросы по тегам