Перевод виртуальной памяти в x86 с PAE

Почему для преобразования адреса виртуальной памяти в физический адрес с трехуровневым разбиением на страницы (2-9-9-12, страница 4 КБ) требуется умножение индекса каждой страницы на 8 перед вычислением следующего?

Например, если у меня есть виртуальный адрес: 0xabde203 (в двоичном формате: 1010 1011 1101 1110 0010 0000 0011).

Первым шагом будет извлечение индекса «Таблица указателей каталогов страниц», который представлен двумя битами - 10, умножение его на 8 => 10000 и суммирование его значения с физическим адресом внешней таблицы, чтобы найти индекс каталога страниц. .

Я понимаю, что при обычном виртуальном переводе x86 разбиение на страницы выполняется с помощью двухуровневого разбиения по страницам (10-10-12), поэтому умножение каждого индекса (представленного 10 битами) на 4 (2 бита) будет равно размеру страницы.

Но почему при использовании PAE выполняется умножение на 8, как это представляет таблицу каталогов страниц?


person Martin    schedule 12.01.2019    source источник


Ответы (1)


В традиционном 32-битном разбиении на страницы каждая запись каталога страниц и каждая запись таблицы страниц составляет 4 байта, поэтому индекс умножается на 4. В PAE и 64-битном разбиении на страницы каждая запись в таблице составляет 8 байтов, поэтому индекс умножается на 8.

На страницу размером 4 КБ помещается 1024 4-байтовых записи, поэтому при двухуровневом разбиении на страницы каждый индекс составляет 10 бит. 512 8-байтовых записей умещаются на странице размером 4 КБ, поэтому в PAE каждый индекс составляет 9 бит.

Ваше наблюдение, что 4 * 2 ^ 10 - это 4K, уместно. 8 * 2 ^ 9 тоже 4K.

person prl    schedule 12.01.2019
comment
Во-первых, спасибо за ответ! Но я все еще кое-что упускаю, а как насчет первых двух битов, которые представляют индекс в указателе Page Diectory? Почему их тоже умножают на 8? - person Martin; 12.01.2019
comment
По той же причине - PDPTE имеют размер 8 байт каждый. Неважно, что их нет на целой странице. - person prl; 12.01.2019