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

ЭВУ 2 семестр / Презентации ЭВУ в пдф / метода моховикова

.pdf
Скачиваний:
43
Добавлен:
31.05.2015
Размер:
4.4 Mб
Скачать

Рис. 39. Формирование ли-

нейного адреса в защищенном режиме

Дескрипторы представляют собой 8-байтную структуру данных, исполь-

зуемую для определения свойств программных элементов, таких как сегмен-

ты, шлюзы и таблицы. Дескриптор определяет положение элемента в памяти,

размер занимаемой им области (лимит), его назначение и характеристики за-

щиты. Все дескрипторы хранятся в таблицах, обращение к которым поддер-

живается процессором аппаратно.

Защищенный режим предоставляет средства переключения задач. Со-

стояние каждой задачи (значение всех связанных с ней регистров процессо-

ра) может быть сохранено в специальном сегменте состояния задачи TSS (Task State Segment), на который указывает селектор в регистре задачи TR (Task Register). При переключении задач достаточно загрузить новый селек-

тор в регистр задачи, и состояние текущей задачи автоматически сохраняется в ее TSS, а в процессор загрузится состояние новой (возможно, ранее пре-

рванной) задачи и начнется (продолжится) ее выполнение.

Дескрипторы и привилегии являются основой системы защиты: деск-

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

бое нарушение защиты приводит к возникновению специальных исключе-

ний, обрабатываемых ядром операционной системы.

Механизм виртуальной памяти позволяет любой задаче использовать логическое пространство размером до 64 Тбайт (16 К сегментов по 4 Гбайт).

Для этого каждый сегмент в своем дескрипторе имеет специальный бит, ко-

торый указывает на присутствие данного сегмента в оперативной памяти в

101

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

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

ствии в памяти. При обращении задачи к отсутствующему сегменту процес-

сор вырабатывает соответствующее исключение, обработчик которого и за-

ведует виртуальной памятью в операционной системе.

Механизм страничной переадресации обеспечивает виртуализацию па-

мяти, адресуемой логическим адресом, на уровне страниц фиксированного размера после подкачки сегмента (страницы) выполнение задачи продолжа-

ется, так что виртуализация памяти для прикладных задач прозрачна (если не принимать во внимание задержку, вызванную подкачкой).

Процессор предоставляет только необходимые аппаратные средства поддержки защиты и виртуальной памяти, а их реальное использование и ус-

тойчивость работы программ и самой операционной системы защищенного режима зависят от корректности построения операционной системы и преду-

смотрительности ее разработчиков.

9.2. Особенности формирования физического адреса в защищенном режиме

Как отмечалось выше, защищенный режим сохранил сегментную мо-

дель памяти (адрес ячейки памяти определяется суммой компонент: адрес начала сегмента и внутрисегментного смещения). Но в отличие от режима реального адреса, где адрес сегмента находился непосредственно в одном из сегментных регистров, алгоритм формирования физического адреса в защи-

щенном режиме абсолютно иной.

Сегмент в защищенном режиме – это не просто область памяти, ограни-

ченная лишь максимально допустимым значением внутрисегментного сме-

102

щения, как это было в реальном режиме, – это «объект», который имеет стро-

го определенный размер.

Минимальный размер сегмента может быть равен 1 байт, а максималь-

ный – 1 Мб или 4 Гб (это зависит от того, умножается размер сегмента на 4

Кбайт или нет).

Этот сегмент:

не пересекается с другими сегментами (хотя один и тот же сегмент можно описать дважды);

имеет ряд других атрибутов, по которым, в частности, про-

исходит аппаратная защита памяти со стороны процессора;

каждый сегмент имеет свой дескриптор (описатель сегмента);

дескрипторы сегментов собираются в специализированных системных сегментах – дескрипторных таблицах.

10. Дескрипторы и таблицы

В системах на базе процессоров x86 допускается создание почти любого числа сегментов – необходимо только наличие соответствующего дескрипто-

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

щения дескрипторов произволен, а максимальное число дескрипторов – 8

192. Таким образом, максимальный размер дескрипторной таблицы – 64

Кбайт.

Дескрипторные таблицы – служебные структуры данных, содержащие дескрипторы сегментов. Существует три типа дескрипторных таблиц – гло-

бальная таблица дескрипторов (одна в системе); локальная таблица деск-

рипторов (своя для каждой задачи); таблица дескрипторов прерываний (рис.

40). Каждый дескриптор (элемент) таблицы описывает свой сегмент памяти,

причем сегменты памяти не пересекаются.

103

Адрес начала каждой из таблиц (указатель на начало табли-

цы) хранится в специальных (программно доступных) регистрах про-

цессора.

Указатели на таблицу глобальных дескрипторов (GDTR) и

таблицу прерываний (IDTR) имеют размер 48 байт, 32 из которых ука-

зывают линейный адрес начала таблицы, а остальные 16 – ее размер

(предел).

 

Глобальная таб-

Локальная таб-

Таблица прерыва-

лица

лица

ний

 

 

 

 

 

 

Рис. 40. Типы дескрипторных таблиц

 

 

 

 

 

 

 

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

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

лицы векторов прерываний процессора i8086. Начальный адрес таблицы на-

ходится в системном регистре IDTR микропроцессора. Для каждой задачи в дополнение к таблице GDT можно построить свою, локальную дескриптор-

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

ности и хранятся в сегментах программы, на которых есть ссылка в GDT. Ло-

кальные таблицы используют 16-битный селектор, что упрощает манипуля-

цию с сегментами. Локальные дескрипторные таблицы могут участвовать в

104

свопинге памяти, как и обычные сегменты. Отправной точкой входа в деск-

риптор является селектор. Полный формат регистра селектора приведен на рис. 39.

Команды загрузки регистров-указателей таблиц (GDTR, LDTR, IDTR)

являются привилегированными (выполняются только на нулевом кольце привилегий). У регистра-указателя локальной дескрипторной таблицы

(LDTR) программно доступно только 16-битное поле селектора (индекса для

GDT), по которому из GDT автоматически загружаются программно недос-

тупные и невидимые поля базового адреса и размера таблицы (рис. 41). Ре-

гистр LDTR указывает на дескриптор в GDT, описывающий локальную деск-

рипторную таблицу для текущей задачи.

Рис. 41. Регистры различных дескрипторных таблиц

10.1. Глобальная таблица дескрипторов

Некоторые важные понятия о GTD (Global Descriptor Table):

Глобальная дескрипторная таблица одна. Она общая для всех задач.

Прежде чем процессор перейдет в PM (защищенный режим), должна быть определена GDT(глобальная таблица дескрипторов), так как все сегмен-

ты и прочие системные объекты должны быть описаны в дескрипторной таб-

лице;

105

● Процессору все равно, где именно вы расположили эту таблицу, но, в

любом случае, она будет находиться в первом мегабайте адресного простран-

ства, потому что только из режима реальных адресов можно перевести про-

цессор в защищенный режим.

● Таблица GDT будет выровнена на границу 8 байт, так как дескрипто-

ры, из которых она состоит, имеют 8-байтный размер. Выравнивание позво-

лит процессору максимально быстро обращаться к дескрипторам, что, есте-

ственно, увеличивает производительность.

● Число дескрипторов, определенных в GDT, может быть любым, от 0

до 8 192. Размер таблицы не может превышать 8 192 дескрипторов, посколь-

ку один дескриптор занимает 8 байт, а лимит в регистре GDTR – 2-байтный и хранит размер таблицы минус один (максимальное значение лимита – 65

535), а 8192x8 = 65 536.

● Нулевой дескриптор, т. е. определенный в самом начале GDT, процес-

сор не использует, обращение к такому дескриптору могло бы быть, когда поле Index селектора равно 0. Если все же в программе встречается обраще-

ние к нулевому дескриптору, то процессор генерирует исключение и не по-

зволит доступ к такому дескриптору.

● Нулевой дескриптор можно использовать как шаблон, на основе кото-

рого программа может создавать новые дескрипторы, но на практике их удобнее создавать иными способами3.

Особенности работы с GTD

Размер GDT желательно не менять в процессе выполнения программ в защищенном режиме. Если ваша программа будет динамически создавать новые дескрипторы, то размер GDT лучше всего заранее задать достаточно большим, например, 64 Кб (максимальный размер). Однако следует учиты-

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

3 Подробнее об этом см. [11], лекции с 15 по 17.

106

10.2. Категории дескрипторов

Основные дескрипторы подразделяются на следующие категории (см.

Прил. 2):

Дескрипторы адресных пространств:

1)сегмент кода;

2)сегмент данных;

3)сегмент состояния задачи.

Дескрипторы системных объектов:

1)шлюз вызова (ограниченно совместим);

2)шлюз задачи;

3)шлюз прерывания;

4)шлюз ловушки;

5)таблицы локальных дескрипторов.

Сам же формат дескриптора системных сегментов представлен на рис.

42, и содержит следующие компоненты: Размер – размер сегмента; Байт доступа – содержит информацию о защите сегмента; D – бит разрядности выполняемых команд (для кодового сегмента), в частности 0–16-разрядные,

1–32-разрядные; G – признак единицы измерения сегмента: 0 – в байтах, 1 –

в страницах (по 4 Кб), при использовании страничной адресации памяти;

AVL – сегмент доступен для использования системным программным обеспечением (используются только ОС).

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

107

Системные сегменты предназначены для хранения локальных таблиц дескрипторов LDT и состояния задач TSS (Task State Segment).

Их дескрипторы определяют базовый адрес, лимит сегмента (1–64

Кбайт), права доступа (чтение, чтение/запись, только исполнение кода или исполнение/чтение) и присутствие сегмента в физической памяти.

В байте управления доступом у этих дескрипторов бит Р определяет действительность (Р = 1) или недействительность (Р = 0) содержимого сег-

мента.

Поле уровня привилегий DPL используется только в дескрипторах сег-

ментов состояния задач (TSS). Поскольку обращение к дескрипторам LDT

возможно только по привилегированным командам, поле DPL для дескрип-

торов локальных таблиц не используется.

Поле ТYPE (1–3, 9-В) определяет тип сегмента.

10.3. Межсегментная передача управления

Межсегментная передача управления непосредственно (командами

JMP, CALL, INT, RET и IRET) возможна только к сегментам кода с тем же уровнем привилегий либо к подчиненным сегментам, уровень привилегий которых выше, чем CPL (текущий уровень привилегий), при этом CPL не изменяется. Для переходов с изменением уровня привилегий используются шлюзы. Для каждого способа косвенной межсегментной передачи управле-

ния имеются соответствующие шлюзы, которые позволяют процессору авто-

матически выполнять контроль защиты. Шлюзы вызова (Call Gates) исполь-

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

(Task Gates) – для переключения задач, а шлюзы прерываний (Interrupt Gates) и ловушек (Trap Gates) определяют процедуры обслуживания преры-

ваний. Шлюзы вызова позволяют автоматически копировать заданное число слов из старого стека в новый. Шлюзы прерываний отличаются от шлюзов

108

ловушек только тем, что они запрещают прерывания (сбрасывают флаг IF в

регистре флагов EFLAGS), а шлюзы ловушек – нет. Для каждого типа шлю-

зов используются соответствующие дескрипторы шлюзов (Gate Descriptors).

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

Теперь давайте рассмотрим общий формат дескриптора и так называе-

мые форматы дескриптора первой (дескриптор пространства) и второй (деск-

риптор системных объектов) групп (рис. 43).

Рис. 43.

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

ра

Общие поля-характеристики для обеих групп дескрипторов:

1.Наличие в ОЗУ [P – бит присутствия]

2.Уровень привилегий [DPL – 2 бит уровня доступа]

3.Расширенный тип** [ETYPE – 5 бит расширенного типа]

Выделим общие поля-характеристики дескрипторов 1-й группы:

1.Разрядность [D – бит разрядности, 16 бит/32 бит]

2.Гранулярность [G – бит дробности, 1 байт/4 Кб]

3.Сегмент/системный объект [S – бит типа сегмент/объект]

4.Собственные нужды ОС [AVL – бит нужд ОС]

5.Базовый адрес [BASE – 32 бит базового адреса]

6.Предел сегмента [LIMIT – 20 бит размера сегмента]

Выделим общие поля-характеристики дескрипторов 2-й группы:

* Расширенный тип введен для приведения всех типов дескрипторов разных групп к общему типу. Он учитывает значение поля S – системного бита.

109

1.Смещение [OFFSET – 32 бит смещения]

2.Селектор [SELECTOR – 15 бит]

3.Константа [CONST – 3 бит = 000]

Для 2-й группы дескриптор типа A является ограниченно совместимым c

другими дескрипторами этой группы из-за наличия поля COUNT – количест-

во параметров 5 бит. В принципе, это поле в других сегментах можно выде-

лить как резерв.

Таким образом, выделим две структуры данных для класса дескрипто-

ров (рассмотренные здесь конструкции структур прописаны на языке про-

граммирования Си):

«дескриптор пространства» – группа 1 (рис. 44):

Рис. 44. Дескриптор пространства

struct s_DSpace

{

word wLimit; word wBase_I; byte bBase_II; byte bAttr_I; byte bAttr_II; byte bBase_III; };

«дескриптор системных объектов» – группа 2 (рис. 45):

Рис. 45. Дескриптор системных объектов

struct s_DSysObj

{

word wOffset_I;

110