Ага, все правильно. Имея только один уровень таблиц страниц и 4 байта на запись, таблица страниц будет иметь
4 GiB (maximal physical address space) / 4 KiB (size of one page frame) * 4 Bytes = 4 MiB
и доступ к физическому адресу будет похож на
(page table entry)->(offset)
Чтобы уменьшить размер этой большой таблицы страниц, используется многоуровневая схема разбиения на страницы, уменьшая размер до
2^10 Bytes * 4 + 2^10 Bytes * 4 = 8 KiB
и изменение разрешения виртуального адреса на физический адрес, чтобы
(page directory entry)->(page table entry)->(offset)
Это позволяет сэкономить несколько байтов (4 MiB - 8 KiB), но имеет один недостаток: требуется одна дополнительная ссылка на память для преобразования виртуального адреса в физический. Здесь в игру вступает TLB (буфер альтернативной трансляции). Это (по сравнению с кешем L1) небольшой кэш, в котором аппаратно хранится связь виртуального адреса с физическим адресом. Здесь используется специальное оборудование, сравнимое с хеш-таблицей (std::unordered_map
в стандартной библиотеке C ++), с той разницей, что оно реализовано аппаратно и, следовательно, быстрее.
Это 32-битная схема подкачки по умолчанию, используемая в архитектуре x86. x86-64, PSE, PAE, несколько измените механизм с большим количеством уровней таблиц страниц, большими размерами страниц (2 MiB, 4 MiB и даже 1 GiB) и большим физическим адресным пространством ( максимум 64 ГиБ с PAE), что приводит к большему количеству уровней таблиц страниц. Виртуальные адреса x86-64 имеют размер 48 бит, что приводит к огромному адресному пространству для каждого процесса (несколько ТиБ).
Обратите внимание на разницу между страницей и рамкой страницы. Страница - это данные, страничный фрейм - это область физической памяти, на которую отображаются страницы. Есть системы, где page's size = x * page frame's size
, где x > 1
.
person
cadaniluk
schedule
21.10.2015