7.4.2.2. Дескрипторы сегментов
Дескрипторы - это те объекты, на которые показывают
селекторы сегмента. Они представляют собой 8-байтовые блоки, содержащие
атрибуты области линейных адресов, т.е. сегмента. Эти атрибуты включают 32-разрядный линейный
базовый адрес сегмента, 20-разрядную
длину и дробность сегмента, уровень защиты, привилегии
по чтению, записи и выполнению, размер операндов по умолчанию (16-или 32-разрядные) и тип сегмента. Вся информация
об атрибутах дескриптора содержится в 12 битах дескриптора сегмента. Сегменты
МП 80386 в целом имеют три поля
атрибутов: бит Р присутствия, биты DPL уровня привилегий дескриптора и
бит S дескриптора сегмента.
Дескрипторы сегментов хранятся либо в таблице GDT, либо в
таблице LDT, которые МП 80386 адресует с
помощью регистров GDTR или LDTR соответственно.
Дескриптор сегмента обеспечивает МП 80386 данными,
которые ему нужны для отображения логического адреса в линейный адрес. Эти дескрипторы
создаются не прикладными
программами, а компиляторами, редакторами связей, загрузчиками или операционной системой. На
рис. 2.2 показан общий формат дескриптора сегмента.
Дескриптор сегмента имеет следующие поля:
База. Определяет место сегмента внутри линейного 4-Гбайт
адресного пространства.
Процессор объединяет три фрагмента базового адреса для формирования одного 32-разрядного значения.
Граница. Определяет размер сегмента. Процессор связывает две части
поля границы для формирования
20-разрядного результата. Затем он интерпретирует поле границы одним из двух способов в зависимости от состояния бита дробности:

Рис. 2.2. Общий формат дескриптора сегмента.
в единицах байтов для определения границы до 1 Мбайт;
в единицах страниц по 4 Кбайт для определения границы до 4
Гбайт, при загрузке поле границы
сдвигается влево на 12 бит и в младшие биты вставляются единицы.
Бит дробности G. Определяет размер единиц, в
которых интерпретируется поле границы.
Если G = О, то граница интерпретируется в байтах, иначе в
единицах по 4 Кбайт.
Бит системного сегмента S. Определяет, является ли данный
сегмент системным (S = 0) или же сегментом программы или
данных (S = 1).
Тип. Интерпретация этого поля зависит от вида дескриптора. В
дескрипторах сегментов программы или данных это поле содержит 3-разрядный тип и
один бит флага
обращения. Дескрипторы системных сегментов используют следующий набор значений в поле типа:

Уровень привилегий дескриптора DPL. Используется механизмом защиты.
Бит присутствия сегмента Р. Если этот бит очищен, то данный
дескриптор не может
быть использован при трансляции адресов. Когда селектор такого дескриптора загружается в регистр
сегмента, процессор переходит к обработке исключения. На рис. 2.3 показан формат
отсутствующего дескриптора.
Бит обращения А. Устанавливается в дескрипторах программы и данных
при обращении к сегменту. Операционные системы, реализующие виртуальную память на уровне сегментов, могут следить
за частотой использования сегмента путем периодической
проверки и очистки этого бита.
В дополнение к значению селектора каждый регистр
сегмента имеет связанный с ним «невидимый»1* кэш-регистр дескриптора сегмента. Когда
содержимое регистра сегмента
изменяется, то 8-байтовый дескриптор, связанный с этим селектором, автоматически загружается в
кэш-регистр. После загрузки этого регистра все ссылки на данный сегмент используют
информацию кэшированного дескриптора вместо повторного обращения к самому дескриптору.

Рис. 2.3. Формат не
присутствующего дескриптора.
Для обеспечения совместимости операционных систем МП
80286 и 80386 последний
поддерживает все дескрипторы сегментов МП 80286. Единственное
различие между двумя форматами состоит в значениях полей
типа и в том, что поля границы и базового адреса в МП 80386 расширены.
Дескрипторы сегментов МП 80286 содержат 24-разрядный
адрес и 16-разрядную
границу. С другой стороны, дескрипторы сегментов МП 80386 имеют 32-разрядный базовый адрес,
20-разрядную границу и бит дробности G. Таким образом, если старшее слово дескриптора
равно нулю, то это дескриптор для МП 80286.
Еще одно различие между дескрипторами МП 80286 и 80386
заключается в интерпретации
поля счетчика слов вентиля вызова и бита В. Поле счетчика слов
определяет количество 16-разрядных блоков при копировании для вентиля вызова МП 80286 и 32-разрядных блоков
для вентиля вызова МП 80386. Бит В управляет размером блоков, загружаемых в
стек при использовании вентиля вызова. Если В = 0, то это блок в 16 бит, иначе блок в 32 бит.