Обычное управление страницами в Linux

Начиная с процессоров 80386, блок управления страницами в процессорах Intel обрабатывает 4 Кбайт страниц.
Тридцать два бита линейного адреса разделяются на три поля:
каталог Directory —старшие 10 битов;
таблица данных —средние 10 битов;
смещение offset —младшие 12 битов.
Страниц потребовалось бы до 22 записей (или, если запись занимает 4 байта, 4 Мбайт оперативной памяти), чтобы представить Таблицу Страниц для каждого процесса (при условии, что процесс использует все 4 Гбайт пространства линейных адресов), даже если процесс не обращается к каждому адресу в этом диапазоне. Двухуровневая схема сокращает объем используемой памяти, поскольку требует Таблицы Страниц только для тех виртуальных областей, к которым фактически обращается процесс.
Каждый активный процесс должен иметь каталог страниц. В то же время отсутствует необходимость выделять память сразу под все Таблицы Страниц процесса. Будет гораздо эффективнее выделять оперативную память для Таблицы Страниц, только когда процесс действительно нуждается в ней.
Физический адрес используемого каталога страниц хранится в управляющем регистре. Поле Directory линейного адреса определяет запись в каталоге страниц, указывающую на соответствующую Таблицу Страниц. Поле Table адреса, со своей стороны, определяет запись в Таблице Страниц, содержащую физический адрес страничного кадра, включающего в себя страницу. Поле offset определяет относительную позицию внутри страничного кадра. Поскольку оно занимает 12 бит, каждая страница содержит 4096 байтов данных.
Поля Directory и Table имеют длину 10 битов, поэтому каталоги страниц и Таблицы Страниц могут содержать до 1024 записей. Отсюда следует, что каталог страниц может адресовать до 1024 х 1024 х 4096 = 232 ячеек памяти, как и следовало ожидать при 32 — разрядной адресации.
Записи в каталогах страниц и в Таблицах Страниц имеют одинаковую структуру и состоят из следующих полей:
— флаг Present —если он установлен, значит, соответствующая страница (или Таблица Страниц) содержится в основной памяти. Если флаг сброшен, значит, страница не содержится в основной памяти, и остальные биты записи могут быть использованы операционной системой по ее усмотрению. Если запись Таблицы Страниц или каталога страниц, участвующих в преобразовании адреса, содержит сброшенный флаг Present, блок управления страницами сохраняет линейный адрес в управляющем регистре и генерирует исключение «ошибка обращения к странице». (В главе 17 мы увидим, как Linux использует это поле);
— поле, содержащее 20 старших битов физического адреса страничного кадра —поскольку каждый страничный кадр имеет размер 4 Кбайт, его физический адрес должен быть кратен 4096, и, следовательно, 12 младших битов этого физического адреса всегда содержит 0. Если это поле относится к каталогу страниц, значит, страничный кадр содержит Таблицу Страниц; если же оно относится к Таблице Страниц, страничный кадр содержит страницу с данными;
флаг Accessed —устанавливается всякий раз, когда блок управления адресует соответствующий страничный кадр. Этот флаг может быть использован операционной системой, когда она выбирает страницы для выгрузки на диск. Блок управления никогда не сбрасывает этот флаг; сброс должна делать операционная система;
— флаг Dirty —относится только к записям Таблицы Страниц. Флаг устанавливается всякий раз, когда выполняется операция записи в страничный кадр. Как и флаг Accessed, флаг Dirty может быть использован операционной системой, когда она выбирает страницы для выгрузки на диск. Блок управления никогда не сбрасывает этот флаг; сброс должна делать операционная система;
— флаг Read/write —сообщает о правах доступа (чтение/запись или чтение) к странице или к Таблице Страниц.
— флаг User/Supervisor —определяет уровень привилегий, необходимый для обращения к странице или к Таблице Страниц;
— флаги pcd и pwt —определяют способ, которым аппаратный кэш управляет страницей или Таблицей Страниц;
— флаг Page size —относится только к записям каталога страниц. Если флаг установлен, значит, запись ссылается на страничный кадр длиной 2 или 4 Мбайт;
— флаг Global —относится только к записям Таблицы Страниц. Этот флаг впервые появился в модели Pentium Pro, чтобы не допустить сброса часто используемых страниц из TLB — кэша. Флаг действует, только если установлен флаг pge (Page Global Enable, Разрешение атрибута глобальности) в регистре.