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

C cистемными сегментами LDT  и TSS нельзя явно производить операции записи, считывания и выполнения, даже в нулевом кольце защиты. При необходимости модификации таких сегментов в программе должны быть объявлены дополнительные алиасные сегменты и дескрипторы, имеющие тот же физический адрес и предел, но объявленные как сегменты данных с разрешенной записью. Сегмент данных, имеющий одинаковые поля базы и предела с другим сегментом (в том числе и программно-недоступном), называется алиасным сегментом или сегментом псевдосинонимом.

Байт доступа дескриптора TSS (строка 2 табл.) содержит бит занятости В (BUSY). Бит занятости В указывает на то,  занят ли данный сегмент выполняемой (текущей) задачей или свободен для использования другим процессором. Занятой задачей называется текущая (выполняемая) или (при использовании цепочки вложенных задач) вызывающая (ожидающая выполнения) задача. При выполнении задачи, т.е. когда задача становится текущей, бит В устанавливается в “1”, при завершении задачи и переключении на другую задачу бит В сбрасывается в “0”. Бит В используется в многопроцессорных системах, чтобы предотвратить выполнение одной и той же задачи несколькими процессорами одновременно. Переключение на задачу с установленным битом занятости вызывает особый случай защиты. Процессор использует бит занятости В также для обнаружения попыток вызова задачи, выполнение которой прервано ( при вложенных задачах).

В системе команд процессора 80х86 нет специальной команды переключения задач. Для переключения и вызова задач процессор 80х86  использует команды CALL и JMP, но по другому их интерпретирует. Операндом указанных команд является селектор для сегмента TSS или селектор шлюза задачи. Особенностью  команд вызова задач, содержащих в соответствии со своим форматом полный адрес перехода (селектор TSS и внутрисегментное смещение для IP), является игнорирование внутрисегментного смещения. При выполнении этих команд в регистр TR загружается селектор из соответствующего поля команды, а регистр IP заносится содержимое поля (Е)IP из вызываемого сегмента TSS.

Задача запускается прерыванием, исключением, переходом или вызовом. При переключении задач прерываниями и исключениями процессор не только вызывает соответствующий обработчик, но и осуществляет автоматический возврат в прерванную задачу, при этом прерывания могут происходить и во время выполнения задач обработки прерываний.

Обычные правила защиты сегментов применимы и к сегментам TSS. Сегмент TSS можно использовать только внутри кольца, определенного уровнем привилегий дескриптора этого сегмента. Для вызова задач в более привилегированном кольце используются шлюзы задач.

Для каждой задачи создается собственный сегмент TSS.

Все сегменты TSS имеют фиксированный формат и содержат всю информацию о состоянии задачи, а также поле обратной связи для реализации вложенности задач.

Структура сегмента TSS состоит из обязательной и необязательной частей. Обязательная часть сегмента TSS содержит всю информацию, необходимую процессору для решения задачи. Дополнительная часть может содержать какую-либо информацию о задаче, используемую операционной системой (например, имя задачи, приоритет выполнения, комментарии и т.п.). Обязательную часть сегмента TSS можно представить как динамический набор регистров, содержимое которых обновляется процессором при каждом переключении задачи, и статический набор регистров, содержимое которых процессор считывает, но не обновляет. В обновляемую часть TSS входит набор регистров процессора, включающий сегментные регистры CS, DS, ES, FS, GS, SS, восемь регистров общего назначения (E)AX, (E)CX, (E)DX, (E)BX, (E)SP, (E)BP, (E)SI, (E)DI, регистр флагов (E)FLAGS  и  указатель команд (E)IP. Кроме того,  в обновляемую часть входит поле, имеющее название “обратная связь”, которое обновляется только при выполнении команд вызова задач, т.е. когда предполагается возврат в вызывающую задачу. При переключении задач с помощью команды CALL в это поле записывается селектор TSS из регистра TR вызывающей задачи, Поле “обратная связь”  используется при возврате в вызывающую задачу.