Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сборка Часть2 / АВМиС / Лекции / Преобразование логического адреса в линейный(защищенный режим

.doc
Скачиваний:
42
Добавлен:
15.09.2014
Размер:
57.34 Кб
Скачать
Преобразование логического адреса в линейный(защищенный режим)

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

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

  1. использует селектор сегмента для нахождения дескриптора сегмента;

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

  3. добавляет смещение к базовому адресу сегмента и получает линейный адрес.

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

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

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

  • Индекс выбирает один из 8192 дескрипторов в таблице дескрипторов. Процессор умножает значение этого индекса на восемь (длину дескриптора) и добавляет результат к базовому адресу таблицы дескрипторов. Таким образом получается линейный адрес требуемого дескриптора.

  • TI - индикатор таблицы определяет таблицу дескрипторов, на которую ссылается селектор: TI=0 означает глобальную дескрипторную таблицу (GDT), а TI=1 - используемую в настоящий момент локальную дескрипторную таблицу (LDT).

  • RPL - запрашиваемый уровень привилегий (Requested Privilege Level). Используется механизмом защиты.

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

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

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

  • Базовый адрес сегмента (Base Address) определяет место сегмента внутри линейного 4Гбайтного адресного пространства. Процессор объединяет три фрагмента базового адреса для формирования одного 32-разрядного значения.

  • Предел сегмента (Segment Limit) определяет размер сегмента. Задает максимальное (для сегментов стека - минимальное) смещение в сегменте, обращение по которому не вызывает нарушения общей защиты. Процессор связывает две части поля границы для формирования 20-разрядного результата. Затем он интерпретирует поле границы одним из двух способов в зависимости от состояния бита гранулярности: в единицах байт для определения границы до 1Мбайт (G=0); в единицах страниц по 4Кбайт для определения границы до 4Гбайт (G=1), при загрузке поле границы сдвигается влево на 12 бит и младшие биты выставляются в 1.

  • G - бит гранулярности (Granularity) определяет размер единиц, в которых интерпретируется поле предела. Если G=0, то граница интерпретируется в байтах, иначе в единицах по 4Кбайт.

  • D - размер по умолчанию (Default size). Задает разрядность данных по умолчанию для дескрипторов сегментов данных или разрядность команд по умолчанию для дескрипторов сегментов кода: D=0 - 16 бит, D=1 - 32 бит.

  • AVL (available) - может использоваться по усмотрению системного программиста.

  • P - бит присутствия (Present). Если этот бит очищен, то данный дескриптор не может быть использован при трансляции адресов. Когда селектор такого дескриптора загружается в регистр сегмента, процессор переходит к обработке нарушения неприсутствия сегмента.

  • DPL - уровень привилегий дескриптора (Descriptor Privilege Level) используется механизмом защиты.

  • S - бит системного дескриптора (System): определяет, является ли данный сегмент системным (S=0) или же сегментом кода/данных (S=1).

  • Тип дескриптора (Type). Интерпретация этого поля зависит от вида дескриптора. В дескрипторах сегментов кода или данных это поле содержит 3-разрядный тип и один бит флага обращения. Дескрипторы системных сегментов используют все 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). Передача управления между обычными сегментами возможна только на одном уровне привилегий. Для подчиняемых сегментов это правило менее строгое: задача может передать управление на более привилегированный подчиняемый сегмент кода, но при этом он будет выполняться на том же уровне привилегий.