Расширенное управление страницами в Linux

Начиная с модели Pentium, микропроцессоры 80×86 могут использовать расширенное управление страницами, которое позволяет страничным кадрам иметь размер 4 Мбайт, а не 4 Кбайт. Расширенное управление страницами применяется для преобразования больших интервалов смежных линейных адресов в соответствующие интервалы физических адресов. В таких случаях ядро может обойтись без промежуточных Таблиц Страниц, экономя, таким образом, память и сохраняя записи TLB-буферов.
Расширенное управление страницами делит 32-битовый линейный адрес на два поля:
каталог (Directory) — Старшие 10 битов;
смещение (offset) — младшие 22 бита.
При расширенном управлении страницами записи каталога страниц такие же, как и при нормальном, за исключением следующих двух моментов:
— флаг Page size должен быть установлен;
— только 10 старших битов 20 — битового поля с физическим адресом являются значимыми. Дело в том, что каждый физический адрес выравнивается по границе 4 Мбайт, так что 22 младших бита адреса содержат нули.
Расширенное управление страницами сосуществует с обычным; оно включается установкой флага pse в процессорном регистре.
Аппаратная схема защиты
Блок управления страницами применяет иную схему защиты, чем блок сегментации. В то время как в процессорах 80×86 существует четыре уровня привилегий при обращении к сегменту, только два уровня привилегий ассоциировано со страницами и Таблицами Страниц. Дело в том, что привилегии определяются при помощи флага user/supervisor, упомянутого в разд. «Обычное управление страницами». Когда этот флаг сброшен, обращаться к странице возможно, лишь если текущий уровень привилегий меньше 3 (для Linux это равносильно тому, что процессор работает в режиме ядра). Когда этот флаг установлен, к странице можно обратиться при любом уровне привилегий.
Кроме того, вместо трех типов прав доступа (чтение, запись и выполнение), ассоциированных с сегментами, со страницами ассоциировано только два (чтение и запись). Если флаг Read/write в записи каталога страниц или Таблицы Страниц сброшен, соответствующая Таблица Страниц или страница может быть только прочитана. В противном случае в отношении нее допустимы и чтение, и запись.
Пример обычного управления страницами
Простой пример поможет понять, как работает обычное управление страницами. Предположим, что ядро присвоило работающему процессу пространство линейных адресов с 0x20000000 по 0x2003 ffff3. Это пространство содержит ровно 64 страницы. Нас не заботят физические адреса страничных кадров, включающих в себя эти страницы. На самом деле, некоторые из них вообще могут быть за пределами основной памяти. Нас интересуют остальные поля записей Таблицы Страниц.
Начнем с десяти старших битов линейных адресов, которые интерпретируются блоком управления страницами как поле Directory. Адреса начинаются с двойки, за которой следуют нули, так что во всех случаях эти 10 битов имеют одно значение 0x080, или 128 в десятичной системе счисления. Получается, что поле Directory во всех адресах ссылается на 129 запись каталога страниц, принадлежащего процессу. Эта запись должна содержать физический адрес Таблицы Страниц, присвоенной процессу. Если процессу не присвоены никакие другие линейные адреса, остальные 1023 записи каталога страниц заполнены нулями.
Значения, которые мы предполагаем увидеть в средних десяти битах (то есть значения полей Table), лежат в диапазоне отО до 0x03f, или от 0 до 63. То есть только первые 64 записи Таблицы Страниц имеют смысл. Остальные 960 содержат одни нули.
Предположим, процессу нужно прочитать байт с линейным адресом 0x20021406. Устройство управления страницами обрабатывает этот адрес следующим образом:
Поле Directory со значением 0x80 используется для выбора записи 0x80 в каталоге страниц. Запись указывает на Таблицу Страниц, ассоциированную с процессом.
Поле Table со значением 0x21 используется для выбора записи 0x21 в Таблице Страниц. Запись указывает на страничный кадр, содержащий нужную страницу.
Наконец, поле offset со значением 0x406 используется для выбора байта со смещением 0x406 в нужном страничном кадре.
Если флаг Present у записи 0x21 в Таблице Страниц сброшен, значит, страница отсутствует в памяти. В таком случае блок управления страницами выдает исключение ошибка обращения к странице”при преобразовании линейного адреса. То же исключение генерируется, когда процесс пытается обратиться к линейному адресу за пределами интервала, ограниченного адресами 0x20000000 и 0x2003ffff, потому что записи Таблицы Страниц, не относящиеся к процессу, заполнены нулями; в частности, флаги Present сброшены.