10.8. Управление задачами

Следующий очень важный механизм, действующий только в защищенном ре­жиме, - многозадачность. Задача - это элемент которую процессор мо­жет исполнять, запустить или отложить. Задачи используют для выполнения про­грамм, процессов, обработчиков прерываний и исключений, ядра операционной

системы и пр. Любая программа, выполняющаяся в защищенном режиме, должна осуществляться как задача (хотя мы пока игнорировали это требование). Процес­сор предоставляет средства для сохранения состояния задачи, запуска задачи и пе­редачи управления из одной задачи в другую.

Задача состоит из сегмента состояния задачи (TSS), сегмента кода, одного или нескольких (для разных уровней привилегий) сегментов стека и одного или не­скольких сегментов данных. Она определяется селектором своего сегмента TSS. Когда задача выполняется, ее селектор TSS (вместе с дескриптором в скрытой части) загружен в регистр TR процессора.

Запуск задачи осуществляется при помощи команды GALL или JMP на сег­мент TSS или на шлюз задачи, а также при запуске обработчика прерывания или исключения, который описан как задачи. При этом автоматически осуще­ствляется переключение задач. Состояние текущей задачи записывается в ее TSS, состояние вызываемой задачи считывается из ее TSS, и управление передается на новые CS:EIP. Если задача не была запущена командой JMP, селектор сегмента TSS старой задачи сохраняется в TSS новой и устанавливается флаг NT, так что следующая команда IRET выполнит обратное переключение задач.

Задача не может вызываться рекурсивно. В дескрипторе которая была запущена, но не была завершена, тип изменяется на «занятый TSS» и пере­ход на такой TSS невозможен.

Задача может иметь собственную таблицу дескрипторов (LDT) и полный ком­плект собственных таблиц страниц, так как регистры LDTR и CR3 входят в со­стояние задачи.