Переключение задачи


Процессор i486 передает управление другой задаче в одном из следующих четырех случаев:

1. Текущая задача выполняет команду JMP или CALL для дескриптора TSS.

2. Текущая задача выполняет команду JMP или CALL для шлюза задачи.

3. Прерывание или исключение индексирует шлюз задачи в IDT.

4. Текущая задача выполняет команду IRET при установленном флаге NT.

Команды JMP, CALL и RET, равно как прерывания и исключения, представляют собой обычные механизмы процессора i486, которые могут быть использованы и при обстоятельствах, не приводящих к переключению задачи. Тип дескриптора (при вызове задачи) или флаг NT (при возврате из задачи) определяют разницу между стандартным механизмом и его формой, вызывающей переключение задачи. Для того, чтобы произошло переключение задачи, команда JMP или CALL может передать управление либо дескриптору TSS, либо шлюзу задачи. Эффект в обоих случаях одинаковый: процессор i486 передает управление требуемой задаче. Исключение или прерывание вызывают переключение задачи, индексируя шлюз задачи в IDT. Если они индексируют в IDT шлюз прерывания или шлюз ловушки, то переключения задачи не происходит.

Переключение задачи

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

Переключение задачи имеет следующие этапы:

1. Проверка того, что текущей задаче разрешено выполнить переключение на другую задачу. К командам JMP и CALL применимы правила привилегированности доступа к данным. DPL дескриптора TSS и шлюза задачи должен быть больше чем или равен одновременно CPL и RPL селектора шлюза. исключения, прерывания и команды IRET имеют право переключать задачу независимо от DPL шлюза задачи или дескриптора TSS назначения.

2. Проверка того, что дескриптор TSS новой задачи помечен как присутствующий и имеет допустимую границу (превышающую или равную 67H). Любые случившиеся до этой точки ошибки принадлежат контексту текущей задачи. При попытке выполнить приводящую к ошибке команду эти ошибки восстанавливают любые изменения состояния процессора. Благодаря этому адрес возврата для обработчика прерываний указывает на команду, вызвавшую ошибку, а не на команду, следующую за ней. Обработчик исключений может зафиксировать условие, вызвавшее ошибку, и выполнить рестарт задачи.

3. Сохранение состояния текущей задачи. Процессор находит базовый адрес текущего TSS в регистре задачи. Регистры процессора копируются в текущий TSS

4. Загрузка в регистр TR селектора для дескриптора TSS новой задачи, установка бита Занятости новой задачи и установка бита TS в регистре CR0. Селектор либо является операндом команды JMP или CALL, либо берется из шлюза задачи.

5. Загрузка состояния новой задачи из ее TSS и продолжение ее выполнения. При этом загружаются регистры LDTR, EFLAGS, регистры общего назначения EIP, EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI, а также сегментные регистры Es, CS, SS, DS, FS и GS. Любые ошибки, обнаруживаемые на этом шаге, принадлежат к контексту новой задачи. С точки зрения обработчика исключений первая команда новой задачи не является выполненной.

Отметим, что состояние старой задачи при переключении задачи всегда сохраняется. При возобновлении этой задачи выполнение ее продолжается с той команды, которая была бы выполнена следующей при обычной работе. Регистры восстанавливаются в те значения, которые они имели к моменту останова задачи для переключения. Каждое переключение задачи устанавливает бит TS (Задача Переключена) регистра CR0. Бит TS полезен системным программам для координации работы целочисленного блока и блока операций с плавающей точкой или сопроцессора. Бит TS указывает на то, что содержимое блока операций с плавающей точкой или сопроцессора может отличиться от соответствующего содержимого для текущей задачи. Подпрограммы обслуживания исключений, вызванных переключением задачи могут начать вызываться рекурсивно в случае попытки перезагрузить селектор сегмента, сгенерировавшего данное исключение. Причина исключения (или одна из нескольких причин) до повторения загрузки сегмента должна быть зафиксирована. Уровень привилегированности, с которым выполнялась старая задача, не имеет отношения к уровню привилегированности новой задачи. Поскольку задачи изолированы друг от друга благодаря отдельным адресным пространствам и сегментам состояния задачи, и поскольку доступ к TSS выполняется по правилам привилегированности, переключение задачи не требует никаких проверок привилегированности. Новая задача начинает выполняться с уровнем привилегированности, указанным в RPL нового содержимого регистра CS, загружаемого из TSS