Формирование физического адреса в защищенном режиме

Основная идея защищенного режима - защитить исполняемые процессором программы от взаимного влияния.

Объектами защиты для процессора являются исполняемые им программы. Так как каждая программа занимает один или несколько сегментов в памяти, то каждому из сегментов присваиваются определенные атрибуты. Любой сегмент памяти в защищенном режиме имеет следующие атрибуты:

─ расположение сегмента в памяти;

─ размер сегмента;

─ уровень привилегий (определяет права данного сегмента относительно других сегментов);

─ тип доступа (определяет назначение сегмента);

─ и некоторые другие.

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

Ключевым объектом защищенного режима является специальная структура -дескриптор сегмента, который представляет собой 8-байтовый дескриптор (краткое описание) непрерывной области памяти, содержащий перечисленные атрибуты.

Если посмотреть на рисунок, то возникнет вопрос: почему разорваны поля, определяющие размер сегмента и его начальный (базовый) адрес? Это результат эволюции процессоров. Защищенный режим впервые появился в процессоре i80286. Этот процессор имел 24-разрядную адресную шину и, соответственно, мог адресовать в защищенном режиме до 16 Мбайт оперативной памяти. Для этого ему достаточно было иметь в дескрипторе поле базового адреса 24 бита и поле размера сегмента 16 битов. После появления процессора i80386 с 32-разрядной шиной команд и данных в целях совместимости программ разработчики не стали менять формат дескриптора, а просто использовали сво­бодные поля. Внутри процессора эти поля объединены. Внешне же они остались разделенными, и при программировании с этим приходится мириться.

Приведем назначение некоторых полей дескриптора сегмента:

limit_l и limit_2 - 20-разрядное поле, определяющее размер сегмента;

base_l, base_2 и base_3 - 32-разрядное поле, определяющее значение линейного адреса начала сегмента в памяти;

AR - байт, поля которого определяют права доступа к сегменту;

D - бит разрядности операндов и адресов D=0 – 16 бит D=1 – 32 бит;

O – зарезервирован Intel

G - бит гранулярности.

В защищенном режиме размер сегмента не фиксирован, его расположение можно задать в пределах 4 Гбайт.

Размер сегмента в защищенном режиме может достигать 4 Гбайт, то есть занимать все доступное физическое пространство памяти. Это возможно за счет наличия поля гранулярности - бит G. Если G = 0, то значение в поле размера сегмента означает размер сегмента в байтах, если G - 1, - то в страницах. Размер страницы составляет 4 Кбайт. Нетрудно подсчитать, что когда максималь­ное значение поля размера сегмента составляет 0fffffhто это соответствует 1 М страниц или величине 1 М х 4 Кбайт = 4 Гбайт.

Выведение информации о базовом адресе сегмента и его размере на уровень процессора позволяет аппаратно контролировать работу программ с памятью и предотвращать обращения к несуществующим адресам либо к адресам, находящимся вне предела, разрешенного полем размера сегмента limit.

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

Бит присутствия P – определяет где размещен искомый сегмент в основной памяти процессора (Р=1) или на диске (Р=0). Бит доступа А фиксирует каждое обращение к сегменту (0 к сегменту не обращаются, 1 обращаются). Бит устанавливается процессором и позволяет отслеживать частоту обращений. За счет битов Р и А ОС реализует виртуальную память. Бит S кодирует назначение и способ использования дескриптора. При S=0 дескрипторы являются системными. S=1 описывает дескрипторы несистемных сегментов кода, данных и стека.

Поле DPL определяет привилегии сегмента, т.е. либо привилегии кода, либо уровень доступности данных. Выделяют 4, так называемых, кольца защиты процессора 80х86.

Уровень привилегий DPL Тип кода или данных
0 (00b) Ядро ОС
1 (01b) Системные программы или утилиты ОС
2 (10b) Расширения ОС (служебные программы), базы данных
3 (11b) Прикладные программы

Поле TYPE объединяющее биты I, C/ED, R/W, определяет тип дескриптора. Проверка типа позволяет обнаруживать ошибки использования сегмента не по назначению. Данные три бита определяют операции которые можно провести над сегментом.

I C/ED R/W Тип дескриптора
      Данные, только чтение
      Данные, чтение/запись
      Стек, только чтение
      Стек, чтение/запись
      Код, только исполнение
      Код, исполнение/чтение
      Код, только исполнение, без указанных привилегий
      Код, исполнение/чтение, без указанных привилегий

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

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

─ глобальная дескрипторная таблица (Global Descriptor Table, GDT), ее адрес хранится в регистре GDTR;

─ локальная дескрипторная таблица (Local Descriptor Table, LDT), ее адрес хранится в регистре LDTR;

─ дескрипторная таблица векторов прерываний (Interrupt Descriptor Table, IDT), ее адрес хранится в регистре IDTR.

В какую именно таблицу должен быть помещен дескриптор, определяется его назначением. Адрес, по которому размещаются эти дескрипторные таблицы, может быть любым; он хранится в специально предназначенном для этого адреса системном регистре.


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



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