Занятие 15. Реализация управления основной памятью в Linux и Windows

План занятия:

  • Использование сегментации в Linux
  • Страничная адресация в Linux
  • Особенности адресации процессов и ядра
  • Сегментация в Windows
  • Страничная адресация в Windows
  • Особенности адресации процессов и ядра в Windows
  • Структура адресного пространства процессов и ядра

Использование сегментации в Linux

Проблему сегментации в Linux решают достаточно просто - ядро ​​практически не использует средств поддержки сегментации архитектуры IA-32. В системе поддерживают минимальное количество сегментов, без которых невозможна корректная адресация памяти процессором (сегменты кода и данных ядра и пользовательского режима). Код ядра и пользовательского режима совместно использует эти сегменты.

Сегменты кода используют при формировании логических адресов кода (для вызова процедур и т.п.); такие сегменты обозначают как доступные для чтения и выполнения. Сегменты данных предназначены для формирования логических адресов данных (глобальных переменных, стека и т.д.) и обозначаются как доступные для чтения и записи. Сегменты режима пользователя доступны из режима пользователя, сегменты ядра - только из режима ядра.

Все сегменты, которые используются в Linux, определяют границу смещения, что позволяет создать в рамках каждого из них 4 Гбайт логических адресов. Это означает, что Linux фактически передает всю работу "по управлению памятью на уровень преобразования между линейными и физическими адресами (поскольку каждый логический адрес соответствует линейному).

Страничная адресация в Linux

В ядре Linux версии 2.4 используют трехуровневую организацию таблиц страниц. Поддерживаются три типа таблиц страниц: глобальный (Page Global Directoiy, PGD); промежуточный каталог страниц (Page Middle Directoiy, PMD); таблица страниц (Page Table).

Каждый глобальный каталог содержит адреса одного или нескольких промежуточных каталогов страниц, а те, в свою очередь, - адреса таблиц страниц. Элементы таблицы страниц (РТЕ) указывают на фреймы физической памяти.

Каждый процесс имеет свой глобальный каталог страниц и набор таблиц страниц. При переключении контекста Linux сохраняет значение регистра в управляющем блоке процесса, передает управление и загружает в этот регистр значение из управляющего блока процесса, начинает выполняться. Итак, когда процесс начинает выполняться, устройство страничной поддержки уже ссылается на корректный набор таблиц страниц.

Особенности адресации процессов и ядра

Линейное адресное пространство каждого процесса разделяют на две части: первые 3 Гбайт адресов используются в режиме ядра и пользователя, они отражают защищенное адресное пространство процесса; остальные 1 Гбайт адресов используют только в режиме ядра.

Элементы глобального каталога процесса, определяющие адреса до 3 Гбайт, могут быть заданы самим процессом, другие элементы должны быть одинаковыми для всех процессов и задаваться ядром.

Потоки ядра не используют элементов глобального каталога первого диапазона. На практике, когда происходит передача управления потока ядра, не меняется значение регистра, то есть поток ядра использует таблицы страниц процесса пользователя, который выполнялся последним (поскольку ему нужны только элементы, доступные в режиме ядра, а вши во всех процессах пользователя одинаковы).

Адресное пространство ядра начинается с четвертого гигабайта линейной памяти. Для прямого отображения на физические адреса доступны первые 896 Мбайт этого пространства (128 Мб, оставшиеся используется преимущественно для динамического распределения памяти ядром).

Сегментация в Windows

Система Windows использует общие сегменты памяти подобно тому, как это делается в Linux. Для всех сегментов в программе задают одинаковые значения базы и границы, поэтому работу по управлению памятью передают на уровень линейных адресов (которые со смещением в этих общих сегментах).

Страничная адресация в Windows

При работе с линейными адресами в Windows используют двухуровневые таблицы страниц, полностью соответствующие архитектуре IA-32. У каждого процесса есть свой каталог страниц, каждый элемент которого указывает на таблицу страниц. Таблицы страниц всех уровней содержат по 1024 элемента таблиц страниц, каждый такой элемент указывает на фрейм физической памяти.

Размер линейного адреса, с которым работает система, составляет 32 бита. Из них 10 бит соответствуют адресу в каталоге страниц, еще 10 - это индекс элемента в таблице, последние 12 бит адресуют конкретный байт страницы (и являются смещением).

Размер элемента таблицы страниц тоже составляет 32 бита. Первые 20 бит адресуют конкретный фрейм (и используются вместе с последними 12 битами линейного адреса), а остальные 12 бит описывают атрибуты страницы (защита, состояние страницы в памяти, файл подкачки использует). Если страница не состоит в памяти, то в первые 20 бит сохраняют смещение в файле подкачки.

Особенности адресации процессов и ядра в Windows

Линейное адресное пространство процесса делится на две части: первые 2 Гбайт адресов доступны для процесса в режиме пользователя и являются его защищенным адресным пространством; остальные 2 Гбайт адресов доступны только в режиме ядра и отражают системное адресное пространство.

Структура адресного пространства процессов и ядра

В адресном пространстве процесса можно выделить следующие участки:

  1. первые 64 Кбайт (начиная с нулевого адреса) - это специальный участок, доступ к которому всегда вызывает ошибки;
  2. всю память между первыми 64 Кбайт и последние 136 Кбайт (почти 2 Гбайт) может использовать процесс во время своего выполнения;
  3. дальше расположены два блока по 4 Кбайт: блоки окружения потока (TEB) и процесса (PEВ);
  4. следующие 4 Кбайт - участок памяти, куда отображаются различные системные данные (системное время, значение счетчика системных часов, номер версии системы), поэтому для доступа к ним, процессу не нужно переключаться в режим ядра;
  5. последние 64 Кбайт используют для предотвращения попыток доступа за пределы адресного пространства процесса (попытка доступа к этой памяти даст ошибку).

Системное адресное пространство содержит большое количество различных участков:

  1. Первые 512 Мбайт системного адресного пространства используют для загрузки ядра системы.
  2. 4 Мбайт памяти выделяют под каталог страниц и таблицы страниц процесса.
  3. Специальный участок памяти размером 4 Мбайт, которую называют гиперпространственной, используют для отображения различных структур данных, специфичных для процесса.
  4. 512 Мбайт выделяют под системный кэш.
  5. В системное адресное пространство отражаются специальные участки памяти - выгружаемый пул и невыгружаемый пул.
  6. Примерно 4 Мбайт в самом конце системного адресного пространства выделяют под структуры данных, необходимые для создания аварийного образа памяти, а также для структур данных.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: