В архитектуре VAX 70-х годов использовался подход виртуализированной линейной таблицы страниц для реализации пейджинга. VAX разбивает 32-битное виртуальное адресное пространство на четыре диапазона:
- P0: 0x00000000 - 0x3fffffff.
- P1: 0x40000000 - 0x7fffffff.
- S0: 0x80000000 - 0xbfffffff.
- S1: 0xc0000000 - 0xffffffff.
P0 (называемый программной областью) и P1 (называемый управляющей областью) являются пользовательскими разделами, S0 является системным разделом (ядром), а S1 резервируется. Таким образом, каждый процесс имеет свой собственный набор отображений для P0 и P1, но все процессы и ядро имеют одинаковые отображения для S0.
Обратите внимание, что два наиболее значимых бита виртуального адреса используются для определения того, к какому разделу виртуальной памяти обращаться. Каждый раздел (кроме S1, который нельзя использовать) определяется таблицей страниц. В частности, P0 и P1 определяются виртуализированной таблицей страниц (таблицы страниц отображаются в виртуальную память), но таблица страниц S0 не виртуализирована. Каждая таблица страниц представляет собой непрерывный массив 4-байтовых записей таблицы страниц. Каждая запись таблицы страниц является недействительной или действительной (что означает, что она содержит физический адрес 512-байтовой страницы).
VAX предоставляет 6 регистров для определения таблиц страниц: регистр базового адреса таблицы страниц и регистр длины таблицы страниц для каждого из трех разделов виртуального адресного пространства P0, P1 и S0. Регистры базовых адресов P0 и P1 содержат виртуальные адреса, чьи два старших бита равны 10. То есть таблица страниц S0 содержит записи таблицы страниц, которые содержат физические адреса P0 и P1. Это позволяет таблицам страниц P0 и P1 любого процесса находиться в основной памяти или во вторичном хранилище. С другой стороны, регистр базового адреса S0 содержит физический адрес таблицы страниц S0.
Таким образом, по сути, таблица страниц процесса разделена на три смежные таблицы страниц, две из которых виртуализированы, а одна всегда находится в памяти. От Википедия :
Было упомянуто, что создание структуры таблицы страниц, которая содержит
сопоставления для каждой виртуальной страницы в виртуальном адресном пространстве могут заканчиваться
быть расточительным. Но мы можем обойти чрезмерные космические проблемы
помещая таблицу страниц в виртуальную память, и позволяя виртуальной
Система памяти управляет памятью для таблицы страниц.
Однако часть этой линейной структуры таблицы страниц всегда должна оставаться
резидент в физической памяти, чтобы предотвратить против циркулярной страницы
ошибки, которые ищут ключевую часть таблицы страниц, которой нет
в таблице страниц, которой нет в таблице страниц и т. д.
Таблица страниц S0 является частью линейной таблицы страниц, которая всегда должна находиться в памяти (то есть не виртуализирована). Но почему это должно быть так? Что произойдет, если регистр базовых адресов S0 содержал виртуальный адрес, а не физический адрес таблицы страниц? Но в таком случае, как процессор может определить физический базовый адрес таблицы страниц? Нам понадобится дополнительная структура данных с известным физическим адресом, которая позволит нам определить физический адрес таблицы страниц. Давайте в качестве аргумента предположим, что у нас есть такая структура данных, которая где-то хранится. Возможно ли, чтобы таблица страниц была полностью выгружена во вторичное хранилище? Да, мы можем сделать это, если у нас есть что-то вроде «существующего бита» или «действительного бита» в этой структуре данных. Однако для текущего бита установлено значение false, при доступе к памяти по любому виртуальному адресу возникает ошибка страницы. Теперь ОС должна обработать ошибку страницы, если ей потребуется доступ к какому-либо виртуальному адресу, она снова будет отображать ошибку страницы и так далее.
В противном случае, в общем, если обработчик ошибок страницы предназначен для использования только физических адресов (путем отключения подкачки), которые указывают на данные и код, которые всегда присутствуют, то фактически вы можете обойти виртуализацию всей таблицы страниц. Но это значительно усложнит конструкцию обработчика.
Разделение таблицы страниц на несколько смежных массивов, например, как это делается в VAX, означает, что некоторая часть таблицы страниц (S0) должна присутствовать всегда.
Но если таблица страниц S0 содержит записи для поиска таблиц страниц P0 и P1, то не является ли это эффективно и многоуровневой таблицей страниц? Чтобы ответить на этот вопрос, давайте сравним, как осуществляется преобразование адресов в VAX и 32-разрядной версии x86.
В переводе VAX номер виртуальной страницы совпадает с индексом таблицы страниц.
|31|29 9|8 0|
------------------------------------
| | virtual page number | offset |
------------------------------------
| | page table index | offset |
------------------------------------
В 32-битной трансляции x86 (с отключенными PAE и PSE) номер виртуальной страницы разбивается на два индекса для двухуровневой таблицы страниц.
|31 12|11 0|
------------------------------------
| virtual page number | offset |
------------------------------------
| PT 1 index|PT 2 index| offset |
------------------------------------
В VAX только доступ к таблицам пользовательских страниц требует двухуровневого поиска. Что еще более важно, два поиска выполняются с использованием двух разных виртуальных адресов. С другой стороны, доступ к системной таблице страниц требует только одного просмотра с использованием одного виртуального адреса. Напротив, в x86 все обращения требуют двухуровневого поиска с использованием одного и того же виртуального адреса.
Архитектура x86 поддерживает виртуализированные многоуровневые таблицы страниц.
Мы можем разработать гибридную таблицу страниц, которая потенциально более мощная, чем обе. Если мы используем раздел S1 в качестве третьего пользовательского раздела. Мы можем добавить регистр базовых адресов для его таблицы, которая содержит физический адрес, а не виртуальный адрес (например, P0 и P1). Таким образом, даже процессы могут получить потенциальную выгоду от производительности линейной таблицы страниц, но при этом позволяют виртуализацию, если требуется менеджер памяти ОС. Я не знаю ни одной архитектуры, которая бы использовала такой дизайн.