[Назад] [Далее] | |
Дескриптор — это 64-битная (восьмибайтная) структура данных, которая может встречаться в таблицах GDT и LDT. Дескриптор способен описывать сегмент кода, сегмент данных, сегмент состояния задачи, быть шлюзом вызова, ловушки, прерывания или задачи. В GDT также может находиться дескриптор LDT.
Дескриптор сегмента данных или кода (подробно рассмотрен в главе 6.1)
байт 7: биты 31 – 24 базы сегмента
байт 6:
бит 7: бит гранулярности (0 — лимит в байтах, 1 — лимит в 4-килобайтных единицах)
бит 6: бит разрядности (0 — 16-битный, 1 — 32-битный сегмент)
бит 5: 0
бит 4: зарезервировано для операционной системы
биты 3 – 0: биты 19 – 16 лимита
байт 5: (байт доступа)
бит 7: бит присутствия сегмента
биты 6 – 5: уровень привилегий дескриптора (DPL)
бит 4: 1 (тип дескриптора — не системный)
бит 3: тип сегмента (0 — данных, 1 — кода)
бит 2: бит подчиненности для кода, бит расширения вниз для данных
бит 1: бит разрешения чтения для кода, бит разрешения записи для данных
бит 0: бит доступа (1 — к сегменту было обращение)
байт 4: биты 23 – 16 базы сегмента
байты 3 – 2: биты 15 – 0 базы
байты 1 – 0: биты 15 – 0 лимита
Если в дескрипторе бит 4 байта доступа равен 0, дескриптор называется системным. В этом случае биты 0 – 3 байта доступа определяют один из шестнадцати возможных типов дескриптора (табл. 22).
Таблица 22. Типы системных дескрипторов
0 | Зарезервированный тип | 8 | Зарезервированный тип |
1 | Свободный 16-битный TSS | 9 | Свободный 32-битный TSS |
2 | Дескриптор таблицы LDT | A | Зарезервированный тип |
3 | Занятый 16-битный TSS | B | Занятый 16-битный TSS |
4 | 16-битный шлюз вызова | C | 32-битный шлюз вызова |
5 | Шлюз задачи | D | Зарезервированный тип |
6 | 16-битный шлюз прерывания | E | 32-битный шлюз прерывания |
7 | 16-битный шлюз ловушки | F | 32-битный шлюз ловушки |
Дескрипторы шлюзов
Дальние CALL или JMP на адрес с любым смещением и с селектором, указывающим на дескриптор шлюза вызова, приводят к передаче управления по адресу, указанному в дескрипторе. Обычно такие дескрипторы используются для передачи управления между сегментами с различными уровнями привилегий (см. главу 10.7).
CALL или JMP на адрес с селектором, указывающим на шлюз задачи, приводят к переключению задач (см. главу 10.8).
Шлюзы прерываний и ловушек используются для вызова обработчиков соответственно прерываний и исключений типа ловушки (см. главу 10.5).
байты 7 – 6: биты 31 – 16 смещения (0 для 16-битных шлюзов и шлюза задачи)
байт 5: (байт доступа)
бит 7: бит присутствия сегмента
биты 6 – 5: DPL — уровень привилегий дескриптора
бит 4: 0
биты 3 – 0: тип шлюза (3, 4, 5, 6, 7, В, С, Е, 7)
байт 4:
биты 7 – 5: 000
биты 4 – 0: 00000 или (для шлюза вызова) число двойных слов, которые будут скопированы из стека вызывающей задачи в стек вызываемой
байты 3 – 2: селектор сегмента
байты 1 – 0: биты 15 – 0 смещения (0 для шлюза задачи)
Дескрипторы TSS и LDT
Эти два типа дескрипторов применяются в многозадачном режиме, о котором рассказано далее. TSS — сегмент состояния задачи, используемый для хранения всей необходимой информации о каждой задаче в многозадачном режиме. LDT — таблица локальных дескрипторов, своя для каждой задачи.
Форматы этих дескрипторов совпадают с форматом дескриптора для сегмента кода или данных, за исключением того, что бит разрядности всегда равен нулю и, естественно, системный бит равен нулю, и биты 3 – 0 байта доступа содержат номер типа сегмента (1, 2, 3, 9, В). Команды JMP и CALL на адрес с селектором, соответствующим TSS незанятой задачи, приводят к переключению задач.