Дескрипторные таблицы состоят из записей по 64 бита (8 байт) в каждой. Формат дескриптора таков:
7 | 6 | 5 | 4 |
Базовый адрес 31-24 | Предел 19-16 | Права доступа | Базовый адрес 23-16 |
3 | 2 | 1 | 0 |
Базовый адрес 15-0 | Предел 15-0 |
Сразу бросается в глаза очень странная организация дескриптора, но это связано с совместимостью с процессором i286, формат дескриптора в котором был таков:
7 | 6 | 5 | 4 |
Зарезервировано | Права доступа | Базовый адрес 23-16 | |
3 | 2 | 1 | 0 |
Базовый адрес 15-0 | Предел 15-0 |
Что же содержится в дескрипторе:
Базовый адрес - 32 бита (24 бита для i286). Определяет линейный адрес памяти, с которого начинается сегмент. В отличие от реального режима этот адрес может быть указан с точностью до байта.
Предел - 20 бит (16 бит для i286). Определяет размер сегмента (максимальный адрес, по которому может быть произведено обращение, это справедливо не всегда но об этом чуть позже). 20-битное поле может показаться не очень то большим для 32-х битного процессора, но это не так. Оно не всегда показывает размер в байтах. Но и об этом чуть позже.
Байт прав доступа:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
P | DPL | S | Type | A |
Бит P (present) - Указывает на присутствие сегмента в памяти. обращение к отсутствующему сегменту вызывает особый случай не присутствия сегмента в памяти.
Двух битное поле DPL определяет уровень привилегий сегмента. Про Уровни привилегий мы поговорим чуть позже.
Бит S (Segment)- Будучи установленным в 1, определяет сегмент памяти, к которому может быть получен доступ на чтение (запись) или выполнение.
Три бита Type - в зависимости от бита S определяет либо возможности чтения/записи, выполнения сегмента или определяет тип системных данных, хранимых в селекторе. Подробнее это выглядит так:
Если бит S установлен в 1, о поле Type делится на биты:
2 | 1 | 0 |
1 - код | Подчиненный сегмент кода | Допустимо считывание |
0 - данные | Расширяется вниз | Допустима запись |
Если сегмент расширяется вниз (это используется для стековых сегментов) то поле предела показывает адрес, выше которого допустима запись. ниже запись недопустима и вызовет нарушение пределов сегмента.
TYPE | A | Описание |
000 | 1 | TSS для i286 |
001 | 0 | LDT |
001 | 1 | Занятый TSS для i286 |
010 | 0 | Шлюз вызова i286 |
010 | 1 | Шлюз задачи |
011 | 0 | Шлюз прерывания i286 |
011 | 1 | Шлюз исключения i286 |
100 | 1 | TSS для i386 |
101 | 1 | Занятый TSS i386 |
110 | 0 | Шлюз вызова i386 |
111 | 0 | Шлюз прерывания i386 |
111 | 1 | Шлюз ловушки i386 |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
G | D | 0 | U | Предел 19-16 |