Встроенные средства защиты. Принципы модульности и перемещаемости. Проверка привилегированности сегмента, страница 15

Переключение задачи похоже на вызов процедуры, но оно выполняет сохранение большего количества информации о состоянии процессора. Вызов процедуры сохраняет только содержимое регистров общего назначения, а в некоторых случаях содержимое только одного регистра (Е)IP. Содержимое сохраняемых регистров помещается в стек, чтобы процедура имела возможность вызвать сама себя. Когда процедура вызывает сама себя, она называется рекурсивной. Переключение задачи передает выполнение в полностью иную среду - среду задачи. для этого требуется сохранить содержимое практически всех регистров процессора. В отличие от процедур, задачи не реентерабельны. Переключение задач ничего не помещает в стек. Информация о состоянии процессора сохраняется в сегменте состояния задачи TSS.

Подобно всем сегментам, сегмент TSS определяется одноименным системным дескриптором, который может находиться только  в глобальной дескрипторной таблице GDT. Системный дескриптор TSS предназначен для указания местонахождения, размера и уровня привилегий сегмента состояния задачи TSS. Формат дескриптора для 16- и 32-разрядного TSS представлен на рис. Он похож на дескрипторы сегментов кода и данных и содержит поля базового адреса, предела и прав доступа.

63                              48                      40                                       16                   0

 


0. . .   00                 P  DPL 0 0 0 B1   Базовый адрес сегмента       Предел

Доступ                         23-0                            15-0

Рис. Формат дескриптора 16-разрядного TSS

63     56                      48                       40                                       16                     0

 


 база    G000    Предел  P  DPL 0 1 0 B 1   Базовый адрес сегмента       Предел

31-24                19-16            Доступ                       23-0                            15-0

Рис. Формат дескриптора 32-разрядного TSS

Поле DPL уровня привилегий дескриптора TSS не означает уровень привилегий самого сегмента TSS, так как к нему не могут обращаться никакие программы. К сегментам TSS может обращаться только сам процессор. Функция этого поля аналогична функции поля DPL шлюза вызова: оно показывает какие программы могут обращаться к задаче, которая определяется данным дескриптором TSS.

Поля базы, предела, а также биты гранулярности G и присутствия Р выполняют функции аналогичные их использованию в сегменте данных.

Поле предела дескриптора TSS 32-разрядной задачи может содержать значение 67h, что на один байт меньше минимального размера сегмента TSS. При попытке переключиться на задачу, дескриптор TSS которой имеет предел меньше указанного, возникает особый случай нарушения защиты. При использовании двоичной карты разрешения ввода-вывода или другой системно-зависимой информации, размещенной операционной системой в TSS, предел должен быть больше  67h.

Выбор дескриптора TSS текущей задачи в таблице GDT осуществляется с помощью селектора, загружаемого в программно-доступный 16-битовый регистр задачи TR. Попытка идентифицировать сегмент TSS селектором, который имеет установленный бит TI, вызывает обработку исключения. Для уменьшения времени обращения к операндам сегмента TSS дескриптор TSS текущей задачи после выборки из таблицы GDT запоминается в программно-недоступном 64-разрядном регистре TRт. Содержимое этого регистра автоматически обновляется процессором при смене задачи (при перезагрузке программно-доступного    регистра TR). Хранение в регистре TRт значений базы и границы сегмента TSS делает выполнение задачи более эффективным, поскольку для ссылки к TSS  текущей задачи процессору не требуется извлекать эти значения из памяти.

При инициализации системы с помощью привилегированной команды LTR в регистр TR загружают селектор исходной задачи. В процессе работы содержимое TR может модифицироваться. Обычно процессор оперирует регистром TR автоматически в ходе переключения задач. Попытка загрузить дескриптор TSS  в один из сегментных регистров CSт, DSт, ЕSт, SSт также вызывает обработку исключения.