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

Чтобы пояснить назначение поля “Обратная связь” в сегменте TSS, напомним, что обращение к TSS выполняется с помощью команд JMP и CALL, операндом которых является селектор, загружаемый в регистр задачи TR. Переключение задач осуществляется командами JMP, а вызов задач  -  командами  CALL. Отличие при использовании этих команд состоит в том, что во втором случае, кроме переключения на выбранную задачу ( как и при выполнении команды JMP), предполагается возврат к задаче, из которой был совершен вызов. Для отслеживания передач управления между задачами в прямом и обратном порядке процессоры 80х86 используют специальный механизм, подобный стеку. Он включает в себя поле “Обратная связь” в сегменте TSS, бит занятости В  в байте доступа дескриптора TSS и флаг NT (Nested Task) вложения задачи в регистре FLAGS. Вызов “вложенной” задачи осуществляется командой CALL, адресующей шлюз задачи или непосредственно селектор для сегмента  TSS. Для запоминания вызывающей задачи и служит поле “Обратная связь”. В это поле сегмента TSS вызываемой задачи при вызове записывается содержимое регистра TR вызывающей задачи. Кроме того, при  вызове в регистре (E)FLAGS  вызываемой задачи процессор устанавливает флажок вложенной задачи NT.

Команда JMP при переключении задач сбрасывает флаг NT в нуль и не модифицирует поле “Обратная связь”. По значению флага NT можно судить, инициирована ли задача командой  JMP  или  командой  CALL. При последовательном использовании команд  CALL для вызова задач реализуется многократное вложение задач  (создается цепь вложенных задач). Еще одно различие между командами JMP и CALL заключается в воздействии этих команд на бит  занятости В в байте доступа дескриптора TSS. Команда JMP сбрасывает в “0” бит В в вызывающей (“покидаемой”) задаче, а команда CALL не модифицирует бит В  в вызывающей задаче и одновременно устанавливает бит В в вызываемой задаче, отмечая ее сегмент TSS как занятый. Завершение вызываемой задачи осуществляется с помощью  команды IRET.  Команда IRET анализирует состояние флага  NT в регистре FLAGS завершенной задачи и, если он установлен в “1”,  производит переключение на задачу, адресуемую селектором в поле “Обратная связь”. Бит В в байте доступа дескриптора TSS завершенной задачи сбрасывается (TSS свободен для других процессоров в многопроцессорной системе), содержимое поля “Обратная связь” не изменяется. Флаг NT для задачи, в которую осуществляется возврат, будет сброшен или установлен в соответствии с его состоянием в регистре флагов.

Для иллюстрации вложенности задач рассмотрим пример, в котором задача А вызывается командой JMP (флаг NT для этой задачи сброшен) и, в свою очередь, с помощью команды CALL вызывает задачу B, которая тоже командой CALL вызывает задачу С (Рис.). Во всех задачах, вызываемых командами CALL, устанавливается флаг  NT, а биты занятости В в байте доступа сегментов TSS устанавливаются и не сбрасываются при переключении на вложенную задачу. Установка битов В запретит другим процессорам в многопроцессорной системе выполнение вложенных задач до тех, пока все вложенные задачи не будут завершены.

Текущая задача

 


Селектор  TSS       Регистр  TR задачи  С        

Сегмент  TSS                Сегмент  TSS                 Сегмент  TSS

    задачи   A                    задачи  B                       задачи   C

 


Обратная                         Обратная                        Обратная связь                             связь                               связь

 


NT = 0                              NT = 1                             NT = 1

B =1                                 B =1                                B =1

Рис. Состояние флага NT и бита B при вложении задач