Дескрипторы и привилегии являются основой системы защиты: дескрипторы определяют структуры программных элементов (без которых эти элементы невозможно использовать), а привилегии определяют возможность доступа к дескрипторам и выполнения привилегированных инструкций. Любое нарушение защиты приводит к возникновению специальных исключений, обрабатываемых ядром операционной системы.
Существуют три типа таблиц дескрипторов – локальная таблица дескрипторов LDT (Local Descriptor Table), глобальная таблица дескрипторов GDT (Global Descriptor Table) и таблица дескрипторов прерываний IDT (Interrupt Descriptor Table). Размеры таблиц могут находиться в пределах от 8 байт до 64К -байт, что соответствует числу элементов в таблице от 1 до 8К.
С каждой из этих таблиц связан соответствующий регистр процессора. Регистры GDTR и IDTR имеют программно-доступное 16-битное поле лимита, задающее размер таблицы, и 32-битное поле базового адреса, определяющее положение таблицы в пространстве линейных адресов памяти. У регистра LDTR программно доступно только 16-битное поле селектора, по которому из GDT автоматически загружаются программно-недоступные и невидимые поля базового адреса и границы. Схема выборки дескрипторов показана на рис. 24.
Селектор сегмента (CS…GS) | Дескриптор сегмента теневая часть регистра (CS…GS) | |||||||||||||||||||||||||||||||||||
INDEX | TI | DPL | Атрибуты сегмента | Граница сегмента | Базовый адрес сегмента | |||||||||||||||||||||||||||||||
GDT | (TI=0) | LDT | (TI=1) | |||||||||||||||||||||||||||||||||
Граница GDT | Граница LDT | |||||||||||||||||||||||||||||||||||
... | ||||||||||||||||||||||||||||||||||||
... | ||||||||||||||||||||||||||||||||||||
+ | Дескриптор сегмента | |||||||||||||||||||||||||||||||||||
... |
| Дескриптор | ||||||||||||||||||||||||||||||||||
сегмента | ||||||||||||||||||||||||||||||||||||
| Дескриптор LDT | |||||||||||||||||||||||||||||||||||
... | ... | |||||||||||||||||||||||||||||||||||
Граница GDT | Базовый адрес GDT | Начало GDT | Начало LDT | |||||||||||||||||||||||||||||||||
Регистр GDTR | ||||||||||||||||||||||||||||||||||||
Регистр LDTR | ||||||||||||||||||||||||||||||||||||
INDEX | DPL | Атрибуты LDT | Граница LDT | Базовый адрес LDT | ||||||||||||||||||||||||||||||||
Селектор LDT | теневая часть регистра LDTR | |||||||||||||||||||||||||||||||||||
Рис. 34 Схема выборки дескрипторов из таблиц GDT и LDT
Инструкции загрузки регистров таблиц LGDT, LIDT и LLDT являются привилегированными (выполняются только на уровне привилегий 0). Инструкции LGDT и LIDT загружают из памяти 6-байтное поле, содержащее базовый адрес и лимит локальной таблицы. Инструкция LLDT загружает только селектор, ссылающийся на дескриптор, содержащий базовый адрес и границу локальной таблицы дескрипторов.
Глобальная таблица (GDT) содержит дескрипторы, доступные всем задачам. Она может содержать дескрипторы любых типов, кроме дескрипторов прерываний и ловушек. Нулевой элемент этой таблицы процессором не используется. Локальная таблица (LDT) может быть собственной для каждой задачи и содержит только дескрипторы сегментов, шлюзы задач и вызовов. Сегмент недоступен задаче, если его дескриптора нет в текущий момент ни в GDT, ни в LDT.
Выбор таблицы (локальная или глобальная) определяется по значению бита TI селектора, а положение (номер) дескриптора задается 13-битным полем INDEX селектора. При ссылке на дескриптор, выходящий за лимит таблицы, возникает исключение #GP.
Таблица дескрипторов прерываний, используемая в защищенном режиме, может содержать описания до 256 прерываний. Таблица может содержать только шлюзы задач, прерываний и ловушек. Базовый адрес и лимит таблицы загружается привилегированной инструкцией LIDT (аналогично LGDT). Размер IDT должен быть не менее 256 байт, чтобы в нее поместились все зарезервированные прерывания процессора. Ссылка на элементы IDT происходит по инструкциям INT, аппаратным прерываниям и исключениям процессора. При возникновении прерывания или исключения, дескриптор которого выходит за лимит таблицы, вырабатывается исключение #DF.
В общем виде формат дескриптора представлен на рис. 25, где 32-разрядный базовый адрес сегмента (база ВА[31:0]) и 20-разрядная граница сегмента (L[19:0]) размещены по частям в различных байтах дескриптора.
Граница сегмента L указывает максимальное допустимое значение относительного адреса, которое может использоваться при обращении к сегменту. Величина (L+1) определяет размер сегмента в байтах или страницах. Обращение к ячейке памяти, находящейся за границей данного сегмента, вызывает исключение типа #GP.
Помимо базового адреса и границы сегмента дескрипторы задают ряд других важных его атрибутов, состав которых зависит от вида сегмента. Отдельные биты байта 6 дескриптора определяют следующие атрибуты сегмента.
Байт 7 | Байт 6 | Байт 5 | Байт 4 | ||||||||||||||||||||||||||||
BA[31:24] | G | D/B | Avail | Граница L[19:16] | P | DPL | S | TYPE | Базовый адрес BA[23:16] | ||||||||||||||||||||||
Базовый адрес BA[15:0] | Граница сегмента L[15:0] | ||||||||||||||||||||||||||||||
Байты 3,2 | Байты 1,0 | ||||||||||||||||||||||||||||||
Рис. 35. Общий формат дескриптора
Дескриптор таблицы LDT обеспечивает обращение к локальной таблице дескрипторов для выбора сегментов, используемых при выполнении текущей программы.