4. Управление памятью в защищенном режиме    
 СОДЕРЖАНИЕ
 Введение
 1. Развитие архитектуры
 2. Структура МП
 3. Ресурсы МП
 4. Управление памятью
 5. Защита
 6. Многозадачность
 7. Прерывания и исключения
 8. Инициализация МП
 9. Эмуляция 8086
 Глоссарий
 ПРАКТИКА
 1. Семантический разрыв
 2. CPUID
 3. Защищенный режим
 Вопросы и задания

4.1. Преобразование логического адреса в линейный

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

Для вычисления линейного адреса процессор выполняет следующие действия:

  1. использует селектор сегмента для нахождения дескриптора сегмента;
  2. анализирует дескриптор сегмента, контролируя права доступа (сегмент доступен с текущего уровня привилегий) и предел сегмента (смещение не превышает предел);
  3. добавляет смещение к базовому адресу сегмента и получает линейный адрес.

Если страничная трансляция отключена, то сформированный линейный адрес считается физическим и выставляется на шину процессора для выполнения цикла чтения или записи памяти.

Механизм сегментации

Селектор - это 16-битный идентификатор сегмента. Он содержит индекс дескриптора в дескрипторной таблице, бит определяющий, к какой дескрипторной таблице производится обращение (LDT или GDT), а также запрашиваемые права доступа к сегменту. Если селектор хранится в сегментном регистре, то обращение к дескрипторным таблицам происходит только при загрузке селектора в сегментный регистр, т.к. каждый сегментный регистр хранит соответствующий дескриптор в программно-недоступном ("теневом") регистре-кэше.

Формат селектора:

Селектор

Первый элемент GDT процессором не используется. Селектор, имеющий нулевые индекс и индикатор таблицы, т.е. селектор, указывающий на первый элемент GDT, называется нуль-селектором. Загрузка нуль-селектора в любой регистр сегмента, отличный от регистра CS или SS, не вызывает исключение. Но использование этого регистра сегмента для доступа к памяти вызывает нарушение общей защиты. Это удобно для выявления случайных ссылок.

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

Формат дескриптора:

Формат дескриптора

Типы дескрипторов сегментов:

0 E W A
Сегменты данных
E (expand-down) - расширяется вниз (для стека)
W (writable) - разрешена запись
A (accessed) - бит обращения
0 0 0 x сегмент данных, только чтение
0 0 1 x сегмент данных, чтение-запись
0 1 0 x сегмент стека, только чтение
0 1 1 x сегмент стека, чтение-запись
1 C R A
Сегменты кода
C (conforming) - подчиняемый
R (readable) - разрешено чтение
A (accessed) - бит обращения
1 0 0 x сегмент кода, только исполнение
1 0 1 x сегмент кода, исполнение-чтение
1 1 0 x подчиняемый код, только исполнение
1 1 1 x подчиняемый код, исполнение-чтение

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

В качестве сегментов стека используют сегменты данных, доступные для чтения и записи. Попытка загрузить в SS селектор незаписываемого сегмента приведет к нарушению общей защиты. Для динамического изменения размера стека удобно использовать сегменты данных с расширением вниз (бит E=1). Для таких сегментов предел задает минимальный адрес, вызывающий нарушение предела сегмента, поэтому уменьшение предела в таком дескрипторе приведет к добавлению места у вершины стека.

Сегменты кода могут быть либо обычными, либо подчиняемыми (бит C=1). Передача управления между обычными сегментами возможна только на одном уровне привилегий. Для подчиняемых сегментов это правило менее строгое: задача может передать управление на более привилегированный подчиняемый сегмент кода, но при этом он будет выполняться на том же уровне привилегий.