E.1. Сегментация памяти в защищенном режиме.

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

При всем этом у системного программиста имеется больше возможностей по управлению сегментацией памяти. Так, уже в микропроцессоре i80386 сняты ограничения на размер сегмента. Он может иметь значение от 1 байта до 4 Гбайт. В нем также сняты ограничения на местоположение границы сегмента. Граница сегмента больше не привязана к границе параграфа, да и само понятие "параграф" к защищенному режиму работы микропроцессора не применяется. Программист в описании сегмента сам определяет уровни привилегий и тип используемого сегмента.

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

1. Возможен переход от сегмента к сегменту, имеющих один и тот же уровень привилегий.

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

3. Если необходимо перейти к сегменту кода, имеющий более высокий уровень привилегий, необходимо использовать вентиль.

E.1.1. Дескрипторные таблицы.

В системах на базе процессоров x86 допускается создание почти любого числа сегментов - необходимо только наличие соответствующего дескриптора. Все дескрипторы имеют длину 8 байт и хранятся в специальной области ОЗУ, называемой дескрипторной таблицей (descriptor table). Порядок размещения дескрипторов произволен, а максимальное число дескрипторов - 8192. Таким образом максимальный размер дескрипторной таблицы - 64 Кбайт.

Существует три типа дескрипторных таблиц, выбор которых зависит от назначения сегмента. Рассмотрим эти типы по подробнее.

Глобальная дескрипторная таблица (GDT).

Главной общесистемной таблицей дескрипторов является именно эта системная таблица. Таблицу GDT "коллективно используют" все задачи. Для определения начального адреса GDT предназначен специальный регистр микропроцессора - GDTR. Наличие GDT в системе обязательно при работе микропроцессора x86 в защищенном режиме.

Дескрипторная таблица прерываний (IDT).

Общесистемной является также дескрипторная таблица прерываний. Она содержит в себе дескрипторы специальных объектов - шлюзов. Поскольку шлюзы определяют точки входа программ обработки прерываний и особых случаев, они служат заменой таблицы векторов прерываний процессора i8086. Начальный адрес таблицы находится в системном регистре IDTR микропроцессора.

Локальная дескрипторная таблица (LDT).

Для каждой задачи в дополнение к таблице GDT можно построить свою, локальную дескрипторную таблицу. Она определяет сегменты, доступные только этой, конкретной задаче. Эти таблицы не являются обязательными, создаются по мере надобности, и хранятся в сегментах программы, на которых есть ссылка в GDT. Локальные таблицы используют 16-ти битный селектор, что упрощает манипуляцию с сегментами. Локальные дескрипторные таблицы могут участвовать в свопинге памяти, как и обычные сегменты.

E.1.2. Селекторы.

Отправной точкой входа в дескриптор является селектор. Полный формат регистра селектора приведен на рисунке E.1.

Рис. E.1. Формат селектора микропроцессора x86.

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

Бит индикации таблицы TI показывает. из какой дескрипторной таблицы выбирается дескриптор: (TI=0 - GDT, TI=1 - LDT). Старшие 13 бит определяют нужный дескриптор в дескрипторной таблице.

E.1.3. Формирование линейного адреса.

Формирование линейного адреса в микропроцессоре x86 показано на рисунке E.2.

Рис. E.2. Формирование линейного адреса в защищенном режиме микропроцессора x86.

Из рисунка видно, что базовый адрес сегмента и эффективный адрес принимают равноправное участие в формировании линейного адреса.

E.1.4.Формат дескрипторной таблицы.

E.3. Формат дескрипторной таблицы.

На рисунке E.3. приведен формат дескрипторов в дескрипторных таблицах. Подробнее смотри [??? Григорьев и Обнинск.] На них обозначены:

E.4. Формат локальной дескрипторной таблицы.

Базовый адрес (32-х битный) - базовый адрес сегмента. Именно этот адрес сформирует процессор при нулевом смещении.

Предел (20-битный). Определяет размер сегмента в байтах.

Бит присутствия (P) установлен в состояние 1, когда он находится (присутствует) в физической памяти.

Двухбитное поле привилегий (DPL) определяет уровень привилегий сегмента. Существуют четыре уровня привилегий: от 0 до 3.

Бит S (системный, сегмент) всегда установлен в 1, если этот объект в дескрипторной таблице является сегментом. В случае S=0 данный объект может являться, а может и не являться сегментом памяти.

Бит гранулярности G. При бите гранулярности G = 0 предел сегмента измеряется в байтах, а при G = 1 - в страницах по 4 Кбайт.

Бит D - размер по умолчанию. Он определяет, какая из размерностей для данных (16 или 32 бита) применяется для операндов процессора. При D=0 процессор интерпретирует содержимое сегмента кода как 16-ти битный код процессора i80286, а при D=1 - как 32-х битный код процессора i80486 и старше. Использование бита D - самый простой способ переключения между 16-ти и 32-х битными приложениями.

Бит A - доступа и обращения. Этот бит процессор автоматически устанавливает в состояние 1, когда происходит обращение к сегменту в физической памяти, описываемым данным дескриптором. Он предназначен для предотвращения свопинга сегмента на диск в момент обращения к нему.

Бит X зарезервирован корпорацией Intel для своих будущих разработок. Он должен всегда равняться 0.

Бит U может быть использован программистом для своих целей.

Трехбитное поле ТИП используется для указания целевого использования сегмента. Его значения:

000b - сегмент данных, разрешено только считывание.

001b - сегмент данных, разрешено считывание и запись.

010b - сегмент стека, разрешено только считывание (не используется в практике.)

011b - сегмент стека, разрешено чтение и запись.

100b - сегмент кода, разрешено только выполнение.

101b - сегмент кода, разрешено выполнение и считывание.

110b - подчиненный сегмент кода, разрешено только выполнение.

111b - подчиненный сегмент кода, разрешено выполнение и считывание.

Назад | Содержание | Вперед