6. Многозадачность    
 СОДЕРЖАНИЕ
 Введение
 1. Развитие архитектуры
 2. Структура МП
 3. Ресурсы МП
 4. Управление памятью
 5. Защита
 6. Многозадачность
 7. Прерывания и исключения
 8. Инициализация МП
 9. Эмуляция 8086
 Глоссарий
 ПРАКТИКА
 1. Семантический разрыв
 2. CPUID
 3. Защищенный режим
 Вопросы и задания

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

Процессор инициирует переключение задач в следующих случаях:

  1. При выполнении межсегментного перехода (FAR JMP) или межсегментного вызова (FAR CALL), когда в качестве селектора указан селектор TSS.
  2. При выполнении межсегментного перехода (FAR JMP) или межсегментного вызова (FAR CALL), когда в качестве селектора указан селектор шлюза задачи.
  3. При вызове обработчика прерывания или исключения, если ему в IDT соответствует шлюз задачи.
  4. При выполнении команды IRET, когда EFLAGS.NT=1.

В процессе переключения процессор выполняет следующие действия:

  1. Получает селектор TSS из кода команды (случай 1), из шлюза задачи (случаи 2 и 3), из поля "Связь TSS" текущей задачи (случай 4).
  2. Выполняется контроль привилегий:
    • случай 1: max(CPL,RPL)<=DPLTSS;
    • случай 2: max(CPL,RPL)<=DPLшлюза (DPLTSS не играет роли);
    • в случаях 3 и 4 контроль привилегий не выполняется (для исключений и аппаратных прерываний).
  3. Выполняется контроль предела TSS.
  4. Проверяется доступность задачи: в случаях 1-3 задача должна быть незанятой, в случае 4 (возврат из подзадачи) задача должна быть помечена как занятая.
  5. Выполняется проверка присутствия старого TSS, нового TSS и всех сегментов в новой задаче.
  6. Если переключение инициируется JMP или IRET для текущей задачи очищается флаг занятости (в поле типа дескриптора). В случае CALL или вызова обработчика прерывания/исключения флаг занятости в старой задаче остается установленным.
  7. Если переключение инициируется IRET, для старой задачи сбрасывается бит вложенной задачи (NT) в регистре флагов. В остальных случаях значение EFLAGS.NT для старой задачи не меняется.
  8. Процессор сохраняет контекст процессора в соответствующих полях сегмента состояния старой задачи.
  9. Если переключение инициировано CALL или вызовом обработчика прерывания/исключения, в контексте новой задачи выставляется бит вложенной задачи (EFLAGS.NT=1), а в поле "Связь TSS" новой задачи заносится селектор TSS старой задачи. В противном случае (JMP, IRET), бит остается без изменений.
  10. Дескриптор TSS новой задачи помечается как занятый.
  11. В регистр задачи (TR) загружается новое значение.
  12. Загружается контекст процессора из TSS новой задачи.
  13. Выставляется флаг "задача переключена" CR0.TS=1 и начинается выполнение новой задачи.

Если переключение задач прошло успешно, то контекст старой задачи сохранен, так что она может быть возобновлена позднее с того места, где была прервана. Новая задача не наследует уровня привилегий старой задачи. Для новой задачи CPL устанавливается по полю TSS, соответствующему регистру CS.

При переключении задач не сохраняется контекст сопроцессора, т.к. не все задачи его использует, а сохранение контекста сопроцессора может потребовать дополнительного времени. Попытка выполнить инструкцию сопроцессора, когда CR0.TS=1, вызывает исключение. Это означает, что произошло переключение задач, контекст сопроцессора соответствует старой задаче, а новая задача также собирается использовать сопроцессор. В таком случае обработчик этого исключения может сохранить контекст сопроцессора для старой задачи и загрузить контекст сопроцессора для новой задачи, после чего флаг CR0.TS может быть сброшен.

Поле "Связь TSS" и бит NT регистра флагов обеспечивают вложение задач. Вложение задач происходит при переключении на новую задачу по CALL или вызовом обработчика прерывания/исключения. При этом в новой задаче выставляется EFLAGS.NT=1, а в поле "Связь TSS" заносится селектор TSS предыдущей задачи. Выполнение команды IRET в новой задаче вызывает обратное переключение на предыдущую приостановленную задачу.