Процессор i486 передает управление другой задаче в одном из следующих четырех случаев:
Текущая задача выполняет команду JMP или CALL для дескриптора TSS.
Текущая задача выполняет команду JMP или CALL для шлюза задачи.
Прерывание или исключение индексирует шлюз задачи в IDT.
Текущая задача выполняет команду IRET при установленном флаге NT.
Команды JMP, CALL и RET, равно как прерывания и исключения, представляют собой обычные механизмы процессора i486, которые могут быть использованы и при обстоятельствах, не приводящих к переключению задачи. Тип дескриптора (при вызове задачи) или флаг NT (при возврате из задачи) определяют разницу между стандартным механизмом и его формой, вызывающей переключение задачи. Для того, чтобы произошло переключение задачи, команда JMP или CALL может передать управление либо дескриптору TSS, либо шлюзу задачи. Эффект в обоих случаях одинаковый: процессор i486 передает управление требуемой задаче. Исключение или прерывание вызывают переключение задачи, индексируя шлюз задачи в IDT. Если они индексируют в IDT шлюз прерывания или шлюз ловушки, то переключения задачи не происходит. Более подробную информацию о механизме прерываний см. в Главе 9.
Подпрограмма обслуживания прерывания всегда возвращает выполнение в прерванную процедуру, которая может находиться в другой задаче. Если флаг NT очищен, происходит нормальный возврат. Если флаг NT установлен, происходит переключение задачи. Задача, принимающая переключение, задается селектором TSS в TSS подпрограммы обслуживания прерывания.
Переключение задачи имеет следующие этапы:
Проверка того, что текущей задаче разрешено выполнить переключение на другую задачу. К командам JMP и CALL применимы правила привилегированности доступа к данным. DPL дескриптора TSS и шлюза задачи должен быть больше чем или равен одновременно CPL и RPL селектора шлюза. исключения, прерывания и команды IRET имеют право переключать задачу независимо от DPL шлюза задачи или дескриптора TSS назначения.
Проверка того, что дескриптор TSS новой задачи помечен как присутствующий и имеет допустимую границу (превышающую или равную 67H). Любые случившиеся до этой точки ошибки принадлежат контексту текущей задачи. При попытке выполнить приводящую к ошибке команду эти ошибки восстанавливают любые изменения состояния процессора. Благодаря этому адрес возврата для обработчика прерываний указывает на команду, вызвавшую ошибку, а не на команду, следующую за ней. Обработчик исключений может зафиксировать условие, вызвавшее ошибку, и выполнить рестарт задачи. Вмешательство обработчика исключений может быть полностью прозрачно для прикладной программы.
Сохранение состояния текущей задачи. Процессор находит базовый адрес текущего TSS в регистре задачи. Регистры процессора копируются в текущий TSS (регистры EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, ES, CS, SS, DS, FS, GS и EFLAGS).
Загрузка в регистр TR селектора для дескриптора TSS новой задачи, установка бита Занятости новой задачи и установка бита TS в регистре CR0. Селектор либо является операндом команды JMP или CALL, либо берется из шлюза задачи.
Загрузка состояния новой задачи из ее TSS и продолжение ее выполнения. При этом загружаются регистры LDTR, EFLAGS, регистры общего назначения EIP, EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, а также сегментные регистры Es, CS, SS, DS, FS и GS. Любые ошибки, обнаруживаемые на этом шаге, принадлежат к контексту новой задачи. С точки зрения обработчика исключений первая команда новой задачи не является выполненной.
Отметим, что состояние старой задачи при переключении задачи всегда сохраняется. При возобновлении этой задачи выполнение ее продолжается с той команды, которая была бы выполнена следующей при обычной работе. Регистры восстанавливаются в те значения, которые они имели к моменту останова задачи для переключения.
Каждое переключение задачи устанавливает бит TS (Задача Переключена) регистра CR0. Бит TS полезен системным программам для координации работы целочисленного блока и блока операций с плавающей точкой или сопроцессора. Бит TS указывает на то, что содержимое блока операций с плавающей точкой или сопроцессора может отличиться от соответствующего содержимого для текущей задачи. В главе 10 бит TS и сопроцессоры рассматриваются более подробно.
Подпрограммы обслуживания исключений, вызванных переключением задачи (исключения вследствие шагов 5 - 17 в таблице 7-1) могут начать вызываться рекурсивно в случае попытки перезагрузить селектор сегмента, сгенерировавшего данное исключение. Причина исключения (или одна из нескольких причин) до повторения загрузки сегмента должна быть зафиксирована.
Уровень привилегированности, с которым выполнялась старая задача, не имеет отношения к уровню привилегированности новой задачи. Поскольку задачи изолированы друг от друга благодаря отдельным адресным пространствам и сегментам состояния задачи, и поскольку доступ к TSS выполняется по правилам привилегированности, переключение задачи не требует никаких проверок привилегированности. Новая задача начинает выполняться с уровнем привилегированности, указанным в RPL нового содержимого регистра CS, загружаемого из TSS.
Проверки, выполняемые при переключении задачи
Таблица 7-1-----------------------------------------------------------------Шаг Проверяемое условие Особая 1) Ссылка ситуация на код ошибки----------------------------------------------------------------- 1 Дескриптор TSS присутствует NP TSS новой задачи в памяти 2 Дескриптор TSS не Занят GP TSS новой задачи 3 Граница сегмента TSS больше чем TS TSS новой задачи или равна 103----------------------------------------------------------------- 4 Загрузка регистров из значений, хранимых в TSS----------------------------------------------------------------- 5 Допустимость селектора LDT TS TSS новой задачи новой задачи 6 DPL кодового сегмента TS Новый сегмент кода соответствует RPL селектора 2) 7 Допустимость селектора SS GP Новый сегмент стека 8 Сегмент стека присутствует в памяти SF Новый сегмент стека 9 DPL сегмента стека SF Новый сегмент стека соответствует CPL 10 LDT новой задачи присутствует TS TSS новой задачи в памяти 2)11 Допустимость селектора CS TS Новый сегмент кода 12 Сегмент кода присутствует NP Новый сегмент кода в памяти 13 DPL сегмента стека GP Новый сегмент стека соответствует RPL селектора 14 Допустимость селекторов GP Новый сегмент данных DS,ES,FS и GS 2) 15 Сегменты DS,ES,FS и GS доступны GP Новый сегмент данных для чтения 16 Сегменты DS,ES,FS и GS NP Новый сегмент данных присутствуют в памяти 17 DPL сегментов DS,ES,FS и GS GP Новый сегмент данных больше или равен CPL (если эти сегменты не являются конформными)-----------------------------------------------------------------
Примечание: Следующие процессоры Intel могут использовать другой порядок проверок.
NP = исключение "Сегмент не присутствует"; GP= исключение общей защиты; TS= исключение "Неверный TSS"; SF=исключение "Сбой в стеке".
Селектор является допустимым, если он находится в таблице совместимого типа (например, селектор LDT не может находиться ни в одной таблице, кроме GDT), занимает адрес в пределах границы табличного сегмента и ссылается на совместимый тип дескриптора (например, селектор в регистре CS является допустимым только в том случае, если он индексирует дескриптор кодового сегмента; тип дескриптора задается в его поле Типа).