Механизм расширения физических адресов (РАЕ) в Linux

Объем оперативной памяти, поддерживаемой процессором, ограничен количеством адресных контактов, соединенных с адресной шиной. В старых моделях процессоров Intel, от 80386 до Pentium, использовались 32-разрядные физические адреса. Теоретически в таких системах могла быть установлена оперативная память объемом 4 Гбайт, но на практике из-за требований, предъявляемых процессами режима пользователя к пространству линейных адресов, ядро не могло напрямую адресовать более 1 Гбайт оперативной памяти. Разработчик софта — компания «Октис» — поможет создать программное обеспечение и специализированные информационные системы по индивидуальным требованиям заказчика.
Однако большим серверам, на которых одновременно выполняются сотни, а то и тысячи процессов, необходимо больше 4 Гбайт оперативной памяти, и в последние годы на компанию Intel оказывалось сильное давление с требованием расширить объем памяти, поддерживаемой в 32-разрядной архитектуре 80×86.
Компания удовлетворила эти запросы, увеличив количество адресных контактов на процессорах с 32 до 36. Начиная с модели Pentium Pro, все процессоры Intel способны адресовать до 236 = 64 Гбайт оперативной памяти. Однако увеличившийся диапазон физических адресов можно эксплуатировать только с помощью нового механизма управления памятью, который преобразует 32-битовые линейные адреса в 36-битовые физические.
Одновременно с процессором Pentium Pro компания Intel представила механизм, названный расширением физических адресов, или РАЕ (Physical Address Extension). Другой механизм, расширение размера страницы, PSE-36 (Page Size Extension), был представлен в процессоре Pentium III, но в Linux он не применяется.
Расширение физических адресов активизируется с помощью флага рае в управляющем регистре. Флаг ps (Page Size) в записи каталога страниц позволяет использовать страницы большого размера (2 Мбайт при включенном механизме РАЕ).
Для поддержки механизма РАЕ компания Intel изменила схему управления страницами:
оперативная память (64 Гбайт) разбита на 224 страничных кадра, а размер поля физических адресов в записях Таблицы Страниц увеличен с 20 до 24 битов. Поскольку при включенном механизме РАЕ запись Таблицы Страниц должна иметь 12 флаговых битов (описанных в разд. «Обычное управление страницами») и 24 бита физического адреса, для обеспечения 36 битов пришлось удвоить размер записи Таблицы Страниц, доведя его до 64 битов. В результате Таблица Страниц объемом в 4 Кбайт при работающем механизме РАЕ содержит 512 записей вместо 1024;
был введен новый уровень Таблиц Страниц, названный таблицей указателей на каталог страниц, PDPT (Page Directory Pointer Table). Эта таблица состоит из четырех 64-битовых записей;
управляющий регистр имеет 27 — битовое поле базового адреса таблицы указателей на каталог страниц. Поскольку таблица PDPT хранится в первых четырех гигабайтах оперативной памяти и выровнена по границе 32 байта (25), 27 битов достаточно для представления ее базового адреса;
при отображении линейных адресов в 4-килобайтовые страницы (флаг ps сброшен в записи каталога страниц), 32 бита линейного адреса интерпретируются следующим образом:
— указывает на таблицу PDPT;
биты 31 —30 —указывают на одну из четырех записей таблицы PDPT;
биты 29 —21 —указывают на одну из 512 записей каталога страниц;
биты 20 —12 —указывают на одну из 512 записей Таблицы Страниц;
биты 11 —0 —смещение внутри 4 — килобайтовой страницы;
при отображении линейных адресов в 2 — мегабайтовые страницы (флаг ps установлен в записи каталога страниц), 32 бита линейного адреса интерпретируются следующим образом:
— указывает на таблицу PDPT;
биты 31 —30 —указывают на одну из четырех записей таблицы PDPT;
биты 29 —21 —указывают на одну из 512 записей каталога страниц;
биты 20 —0 —смещение внутри 2 — мегабайтовой страницы.
Подведем итоги. Когда регистр сгЗ установлен, есть возможность адресовать до 4 Гбайт оперативной памяти. При необходимости адресовать больший объем памяти нам придется занести новое значение в регистр сгЗ или изменить содержимое таблицы указателей на каталог страниц. Однако главная проблема, связанная с механизмом РАЕ, заключается в том, что линейные адреса по-прежнему имеют длину 32 бита. Это вынуждает разработчиков ядра использовать одни и те же линейные адреса для отображения разных областей оперативной памяти. Мы вкратце опишем, как Linux инициализирует Таблицы Страниц при включенном механизме РАЕ далее в этой главе. Очевидно, что механизм РАЕ не увеличивает пространство линейных адресов процесса, потому что имеет отношение только к физическим адресам. Кроме того, только ядро может модифицировать таблицы страниц процесса, т. е. процесс, работающий в пользовательском режиме, не может иметь адресное пространство, превышающее 4 Гбайт. С другой стороны, механизм РАЕ позволяет ядру эксплуатировать до 64 Гбайт оперативной памяти, тем самым значительно увеличивая количество процессов в системе.