Дескриптор сегмента (в архитектуре x86) — служебная структура в памяти, которая определяет сегмент. Длина дескриптора равна 8 байт.

База (жёлтые поля, 32 бита) — начало сегмента в линейной памяти Лимит (красные поля, 20 бит) — (размер сегмента в байтах)–1 (База+Лимит = линейный адрес последнего байта) Права доступа (синие поля, 12 бит) — флаги, определяющие наличие сегмента в памяти, уровень защиты, тип, разрядность + один пользовательский флагРазорванность полей дескриптора объясняется эволюционированием процессоров.

Байт прав доступа (AR, , биты 8-15 на рисунке): Бит P определяет доступность сегмента (0 — сегмента нет, 1 — есть). При обращении к сегменту со сброшенным битом P происходит исключение #NP, обработчик которого может загрузить/создать сегмент. Номер привилегий DPL содержит 2-битный номер (0-3), определяющий, к какому уровню (кольцу) защиты относится этот сегмент. Тип сегмента (биты 8–12 на рисунке). Старший бит (S) определяет сегмент как системный (S=0) или пользовательский (S=1). Значение прочих бит для системных и пользовательских сегментов описано в таблице: + Типы системных сегментов № Биты AR Описание 3 2 1 0 0 0 0 0 0 Запрещенное значение 1 0 0 0 1 Свободный 16-битный TSS 2 0 0 1 0 LDT 3 0 0 1 1 Занятый 16-битный TSS 4 0 1 0 0 16-битный шлюз вызова 5 0 1 0 1 Шлюз задачи 6 0 1 1 0 16-битный шлюз прерывания 7 0 1 1 1 16-битный шлюз ловушки 8 1 0 0 0 Запрещенное значение 9 1 0 0 1 Свободный 32-битный TSS A 1 0 1 0 Зарезервировано B 1 0 1 1 Занятый 32-битный TSS C 1 1 0 0 32-битный шлюз вызова D 1 1 0 1 Зарезервировано E 1 1 1 0 32-битный шлюз прерывания F 1 1 1 1 32-битный шлюз ловушки

+ Типы пользовательских сегментов № Биты AR Описание 3 2 1 0 0 0 0 Сегмент данных только для чтения 2 0 0 1 Сегмент данных для чтения/записи 4 0 1 0 Сегмент данных только для чтения, растёт вниз 6 0 1 1 Сегмент данных для чтения/записи, растёт вниз 8 1 0 0 Сегмент кода только для выполнения A 1 0 1 Сегмент кода для выполнения/чтения C 1 1 0 Подчинённый сегмент кода только для выполнения E 1 1 1 Подчинённый сегмент кода для выполнения/чтения Младший бит байта AR пользовательских сегментов (A, , бит 8 на рисунке) можно использовать для сбора статистики о сегменте. При первом же обращении к сегменту (чтение, запись, выполнение) он устанавливается процессором в 1.

Флаг гранулярности G определяет лимит сегмента: при G=0 лимит равен значению соответствующего поля в дескрипторе, а при G=1 лимит равен полю дескриптора, умноженному на (212 = 4096). Таким образом при G=0 максимальный размер сегмента 1 МБайт, а при G=1 4 ГБайт. Флаг разрядности DB (бит 22 на рисунке) актуален для пользовательских сегментов кода и стека. Определяет разрядность в 16 бит при нулевом и 32 бит при единичном значении. Зарезервированный флаг (серое поле) должен всегда равняться нулю в 32 битных дескрипторах и режиме совместимости, одному для 64 битного режима. Пользовательский флаг AVL (A, бит 20 на рисунке) отдан операционной системе. Его состояние никак не влияет на работу с сегментом.

См. также Дескриптор шлюза Дескрипторные таблицы Сегментная защита памяти

Примечания

Ссылки Документы по 486 процессору

Категория:Программирование x86 Категория:Виртуальная память