ЭВУ 2 семестр / Презентации ЭВУ в пдф / метода моховикова
.pdf
Рис. 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
