Многозадачность в защищенном режиме
В отличие от реального режима, в защищенном режиме микропроцессор
предоставляет аппаратную поддержку многозадачности. Эта поддержка включает
в себя возможность сохранения задачи и передачи управления другой
задаче
Каждая задача описывается селектором дескриптора сегмента TSS -
Task State Segment или сегмент состояния задачи. Сегмент TSS для каждой
задачи должен быть описан в таблице GDT (загрузка дескриптора из LDT
вызывает ошибку). Сегмент состояния задачи представляет собой 0x67 байт
данных, в которых сохраняется состояние задачи (т.е. - содержание
регистров процессора и некоторые другие данные) при прекращении ее
выполнения.
Пример дескриптора сегмента TSS в таблице GDT:
67 00 00 00 00 89
40 00
Первые 0x67 байт линейного адресного пространства будут
использованы для хранения состояния задачи, селектор которой указывает на
этот дескриптор Бит 4 пятого байта дескриптора определяет дескриптор
как системный. В этом случае биты 0-3 определяют тип дескриптора. Для TSS
это:
0001 - свободный 16 битный сегмент состояния задачи
0011 -
занятый 16 битный TSS
1001 - свободный 32 битный TSS
1011 - занятый
32 битный TSS
А также:
0101 - шлюз задачи
Селектор выполняющейся в текущий момент времени задачи содержится в
регистре TR. В ОС обычно этот регистр загружается командой LTR при запуске
первой задачи, выполняющейся в многозадачном режиме
Переключение задач производится с помощью дальнего JMP или CALL, если
селектор указывает на TSS или шлюз задачи (а также при прерывании, если
сегмент обработчика - TSS). При переключении на задачу, ее тип в
дескрипторе изменяется на занятый, т.е. задачи не обладают повторной
входимостью. Попытка переключения на занятую задачу вызывает ошибку
защиты. После переключения процессор загружает из TSS регистры - в том
числе CS и EIP, т.е. управление переходит в отложенную точку задачи.