Для возврата выполнения на предыдущую задачу используются поле Компоновки в TSS и флаг NT. Флаг NT указывает на то, является ли текущая выполняемая задача вложенной в выполнение другой задачи, а поле Компоновки в TSS текущей задачи содержит селектор TSS для задачи более старшего уровня, если таковая имеется (см. Рисунок 7-6).
Когда прерывание, исключение, переход или вызов вызывают переключение задачи, процессор i486 копирует селектор сегмента состояния текущей задачи в TSS для новой задачи и устанавливает флаг NT. Флаг NT указывает на то, что поле Компоновки TSS было загружено селектором сохраненного TSS. Новая задача возвращает управление командой IRET. При выполнении команды IRET происходит проверка флага NT. Если он установлен, то процессор выполняет переключение на предыдущую задачу. Отметим, что флаг NT может быть модифицирован программным обеспечением, выполняемым на любом уровне привилегированности. Программа может установить свой бит NT и выполнить команду IRET, что будет иметь эффект запуска задачи, заданной в поле Компоновки TSS текущей задачи. Для предотвращения непредусмотренных переключений задачи операционная система должна инициализировать поле Компоновки каждого создаваемого ей TSS.
Бит Занятости дескриптора TSS предотвращает реентерабельные переключения задач. Существует лишь один сохраненный контекст каждой задачи, а именно контекст, сохраненный в TSS, следовательно, задача до своего завершения может быть вызвана только один раз. Цепочка отложенных задач может вырасти до любой длины вследствие множественных прерываний, исключений, переходов и вызовов. Бит Занятости предотвращает вызов задачи, поставленной в такую цепочку. Реентерабельное же переключение задачи затрет старый TSS задачи, что приведет к разрушению всей цепочки.
Процессор организует бит Занятости следующим образом:
1. При переключении задачи процессор устанавливает бит Занятости новой задачи.
2. При обратном переключении из задачи процессор очищает бит занятости старой задачи, если эта задача не должна быть поставлена в цепочку.
3. При переключении на задачу процессор генерирует исключение общей защиты, если бит Занятости новой задачи оказывается уже установленным.
Модификация компоновки задач
Для возобновления выполнения прерванной задачи до выполнения прервавшей ее задачи может понадобиться модификация цепочки отложенных задач. Надежный способ состоит в следующем: 1. Запретить прерывания. 2. Сначала изменить поле Компоновки TSS задачи прерывания, а затем очистить бит Занятости в дескрипторе TSS задачи, удаляемой из цепочки. 3. Снова разрешить прерывания.
