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




Защищенный режим впервые появился в процессоре Intel 80286 (1982 г.). Этот процессор имел 24-разрядную адресную шину и мог адресовать до 16 Мбайт оперативной памяти.

Основная идея защищенного режима — защитить исполняемые процессором программы от взаимного влияния. В защищенном режиме процессор поддерживает два типа защиты — по привилегиям и по доступу к памяти. Рассмотрим второй тип защиты – по доступу к памяти.

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

Для введения любого механизма защиты нужно иметь как можно больше информации об объектах защиты. Для процессора такими объектами являются исполняемые им программы. Организуя защиту программ по доступу к памяти, фирма Intel не стала нарушать принцип сегментации, свойственный ее процессорам. Так как каждая программа занимает один или несколько сегментов в памяти, то логично иметь больше информации об этих сегментах как об объектах, реально существующих в данный момент в вычислительной системе. Если каждому из сегментов присвоить определенные атрибуты, то часть функций по контролю за доступом к ним можно переложить на процессор. Что и было сделано.

Любой сегмент памяти в защищенном режиме имеет следующие основные атрибуты:

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

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

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

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

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

Ключевым объектом защищенного режима является специальная структура — дескриптор сегмента, который представляет собой 8-байтовый (64-битный) дескриптор (краткое описание) непрерывной области памяти, содержащий перечисленные ранее атрибуты. На рис. 3 приведена структура дескриптора сегмента для 32-разрядных процессоров с 32-разрядной шиной адреса. Приведем назначение некоторых полей дескриптора сегмента:

limit_l (16 разрядов) и limit_2 (4 разряда) — 20-разрядное поле, определяющее размер сегмента;

base_l (16 разрядов), base_2 (8 разрядов) и base_3 (8 разрядов) — 32-разрядное поле, определяющее значение физического адреса начала сегмента в памяти;

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

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

Рис. 3 Структура дескриптора сегмента защищенного режима процессора

 

Поясним наличие в структуре дескриптора разрывов в данных, описывающих, например, адрес начала сегмента (то есть адрес начала сегмента содержится в битах дескриптора с 16 по 39 (младшие 24 бита – “участки” base_1 и base_2) и с 56 по 63 (старшие 8 бит– “участок” base_3)). Дело в том, что процессор i80286 имел 24-разрядную адресную шину и для указания физического адреса было достаточно 24 битного числа в дескрипторе (то есть использовались участки base_1 и base_2). После появления процессора i80386 с 32-разрядной адресной шиной в целях совместимости программ разработчики не стали менять формат дескриптора, а просто использовали свободные биты с 56 по 63 (участок base_3), которые были предусмотрительно зарезервированы разработчиками процессора i80286 для новых моделей. Для процессора эти две группы битов представляют собой единое целое. Внешне же они остались разделенными.

 

Размер поля, определяющего размер сегмента, составляет 20 бит (участки limit_1 и limit_2). Следовательно, размер сегмента, определенный значением этого поля, может быть максимум 220 · 1 байт = 1 Мбайт. Однако, разработчики предусмотрели возможность увеличения описываемого в дескрипторе размера сегмента до 4 Гбайт за счет использования бита гранулярности G. Если G = 0, то значение в поле размера сегмента означает размер сегмента в байтах, если G = 1 — то в страницах. Размер страницы составляет 4 Кбайт. Следовательно, размер сегмента, определенный значением поля limit с учетом бита гранулярности G, может быть максимум 220 · 4 Кбайт = 4 · 210 · 210 Кбайт = 4 Гбайт.

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

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

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

Таблица GDT содержит дескрипторы, доступные для всех задач системы. Обычно GDT содержит дескрипторы сегментов команд и данных, используемых ОС, и дескрипторы таблиц LDT.

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

Процессор поддерживает для каждого процесса отдельную таблицу дескрипторов сегментов LDT. Эта таблица формируется операционной системой на этапе создания процесса. После активизации процесса в регистр LDTR заносится адрес его таблицы LDT. Тем самым система делает недоступным для процесса локальные сегменты других процессов, описанные в их таблицах LDT.

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


 

Схема, показанная на рисунке 4, иллюстрируют принцип формирования физического адреса в защищенном режиме. Регистры сегментов (CS, SS, DS, ES) в защищенном режиме хранят 16-разрядное число, называемое селектором, в котором 12 старших разрядов представляют собой индекс в таблице дескрипторов сегментов (то есть смещение дескриптора относительно начала таблицы дескрипторов,), 1 разряд указывает, в какой из двух таблиц, GDT или LDT, находится дескриптор, а три разряда хранят значение уровня привилегий запроса к данному сегменту.

Рис.4. Сегментированная модель памяти в защищенном режиме.

ПОЯСНЕНИЕ: Пусть процессору необходимо считать информацию из сегмента данных. Процессор смотрит значение, помещенное в регистр DS. Из 16 битов он выбирает тот, который указывает из какой таблицы дескрипторов GDT или LDT необходимо получить описание сегмента. Определив таблицу, процессор считывает физический адрес ее начала соответственно из регистров GDTR или LDTR. Далее процессор берет старшие 12 битов регистра DS, которые определяют номер дескриптора в таблице дескрипторов, и, используя физический адрес начала таблицы и номер дескриптора в этой таблице, считывает 8 байт соответствующего дескриптора. На основании информации, хранящейся в дескрипторе, процессор получает физический адрес начала сегмента данных. Затем к физическому адресу начала сегмента данных прибавляется смещение (процессору получает значение смещения минимум из одного и максимум из трех источников: из значения смещения в самой машинной команде и/или из содержимого одного базового и/или одного индексного регистра). В результате процессор получает физический адрес данных в сегменте данных (физический адрес начала сегмента данных + смещение).




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: