Самая общая формула выглядит так:
total_virtual_address_bits <= bits_for_offset_in_page + levels * bits_per_page_table_index
Эта формула получена путем разделения виртуального адреса на несколько полей.
Вы можете подключить свои значения и убедиться, что это работает:
35 <= 11 + 4 * 7
35 <= 39
Вы также можете изменить формулу:
total_virtual_address_bits <= bits_for_offset_in_page + levels * bits_per_page_table_index
total_virtual_address_bits - bits_for_offset_in_page <= levels * bits_per_page_table_index
levels >= (total_virtual_address_bits - bits_for_offset_in_page) / bits_per_page_table_index
Вы можете подставить свои значения в эту формулу, например:
levels >= (35 - 11) / 7
levels >= 3.4285714
А вот и путаница. Математика работает не совсем идеально (3,4285714 — не очень хорошее целое число), поэтому округляется в большую сторону.
Это означает, что таблица самого высокого уровня будет использоваться только частично (точнее, нам нужно только 3 бита для индекса в таблице страниц самого высокого уровня, поэтому будут использоваться только 8 записей в этой таблице, а остальные 120 записей будут потрачены впустую) .
Обратите внимание, что такое округление происходит на практике. Одним из примеров был 32-битный 80x86 с PAE, где таблица страниц самого высокого уровня составляла всего 32 байта (и размер таблиц страниц и размер страницы, где все 4 КиБ).
person
Brendan
schedule
06.07.2021