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.