Перевод виртуальной памяти в x86 с PAE - PullRequest
0 голосов
/ 12 января 2019

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

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

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

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

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

1 Ответ

0 голосов
/ 12 января 2019

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

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

Ваше замечание, что 4 * 2 ^ 10 - это 4K 8 * 2 ^ 9 также 4K.

...