4. Управление памятью в защищенном режиме    
 СОДЕРЖАНИЕ
 Введение
 1. Развитие архитектуры
 2. Структура МП
 3. Ресурсы МП
 4. Управление памятью
 5. Защита
 6. Многозадачность
 7. Прерывания и исключения
 8. Инициализация МП
 9. Эмуляция 8086
 Глоссарий
 ПРАКТИКА
 1. Семантический разрыв
 2. CPUID
 3. Защищенный режим
 Вопросы и задания

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

Дескрипторные таблицы - это массивы памяти переменной длины, содержащие восьмибайтные элементы - дескрипторы. Дескрипторная таблица может иметь длину от 8 байт до 64Кбайт и в каждой таблице может быть до 8192 дескрипторов. Старшие 13 битов селектора используются как индекс в таблице дескрипторов. Поскольку эти таблицы обслуживает операционная система, то команды загрузки таблицы дескрипторов являются привилегированными командами.

Существуют две обязательных дескрипторных таблицы - глобальная дескрипторная таблица (Global Descriptor Table - GDT) и дескрипторная таблица прерывания (Interrupt Descriptor Table - IDT),- а также множество (до 8191) локальных дескрипторных таблиц (Local Descriptor Table - LDT), из которых в один момент времени процессору доступна только одна. Расположение дескрипторных таблиц определяется регистрами процессора GDTR, IDTR, LDTR. Регистры GDTR и IDTR - 6-байтные, они содержат 32 бита линейного базового адреса дескрипторной таблицы и 16 бит предела таблицы. Программно доступная часть регистра LDTR (16 бит) содержит селектор LDT. Дескрипторы LDT находятся в GDT.

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

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

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

IDT может содержать только шлюзы задач, шлюзы прерываний или шлюзы ловушек.

Типы системных дескрипторов
0 резерв 8 резерв
1 доступный 16-битный TSS 9 доступный 32-битный TSS
2 LDT A резерв
3 занятый 16-битный TSS B занятый 32-битный TSS
4 16-битный шлюз вызова C 32-битный шлюз вызова
5 шлюз задачи D резерв
6 16-битный шлюз прерывания E 32-битный шлюз прерывания
7 16-битный шлюз ловушки F 32-битный шлюз ловушки

Дескрипторы TSS (сегмента состояния задачи) и LDT так же, как и дескрипторы сегментов содержат 32-битный линейный базовый адрес и 20-битный предел. Дескрипторы шлюзов содержат в битах 16-31 селектор вызываемого сегмента кода, а в битах 0-15 и 48-63 смещение точки входа (в шлюзе задачи не используется), а биты 32-39 зарезервированы и должны содержать 0 (для шлюза вызова биты 32-36 определяют количество параметров, передаваемых в стек вызываемой процедуры).

Для обеспечения совместимости с МП 80286 поддерживаются все 16-битные дескрипторы МП 80286. Дескрипторы МП 80286 содержат 24-разрядный адрес и 16-разрядную границу. С другой стороны, дескрипторы 32-битных процессоров имеют 32-разрядный базовый адрес, 20-разрядную границу и бит дробности G. Таким образом, если старшее слово дескриптора равно нулю, то это дескриптор МП 80286.