Организация мультизадачности в процессорах семейства Х86, страница 4

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

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

В заключение, для более четкого представления о процедуре переключения задач, опишем последовательность основных действий, которые при этом происходят.

1.  Если переключение задач осуществляется по командам CALL и JMP, то, прежде всего, должно быть проверено, разрешено ли выходящей задаче переключение на требуемую задачу. Для этого проверяется условие обращения к данным, определяемое правилами системы защиты процессора:

        а) если предусматривается переключение через шлюз задачи, то должно соблюдаться условие: max (CPL, RPL) ≤ DPL шлюза задачи;

        б)  если предусматривается переключение непосредственно на сегмент TSS, то должно выполняться условие: max (CPL, RPL) ≤ DPL сегмента TSS.

2. Если же переключение задач инициируется особыми случаями, прерываниями или командами IRET, то переключение задачи разрешается независимо от значения поля DPL в шлюзе задачи или в дескрипторе сегмента TSS входящей задачи.

3. Затем, дескриптор сегмента TSS входящей задачи должен быть проверен, присутствует ли этот сегмент в оперативной памяти компьютера по значению бита P байта прав доступа дескриптора, и имеет ли предел не меньший 67h.

4. Если указанные проверки дали удовлетворительный результат, процессор сохраняет состояние выходящей задачи. Из теневого регистра дескриптора текущего сегмента TSS он берет его базовый адрес и копирует в TSS всю информацию о состоянии задачи на момент переключения (8 регистров общего назначения, 6 сегментных регистров, регистры EIP, EFLAGS, селектор обратной связи из регистра TR и др.).

5. Далее, загружается в регистр TR селектор дескриптора TSS входящей задачи, устанавливается в его байте прав доступа бит занятости B (Busy) в состояние 1 и, кроме того, устанавливается в состояние 1 бит переключения задачи TS в управляющем регистре CR0. Этот селектор дескриптора TSS извлекается из шлюза задачи, при переключении через шлюз, или непосредственно из команды CALL или JMP, в которых он является операндом.

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

Обобщенная схема принципа реализации переключения задач в случае, когда переключение осуществляется по команде CALL, приведена на рис. VII.3.

Рис.VII. 3   Обобщенная схема принципа переключения задачи в случае,

                когда переключение осуществляется по команде CALL.

Как следует из  изложенного выше, при переключении задач, осуществляется установка следующих управляющих битов.

- Бита TS (Task Switched) в управляющем регистре CR0. Этот бит используется при выполнении команд с плавающей запятой с целью координации операций целочисленного арифметического устройства процессора с арифметическим сопроцессором FPU. Он проверяется процессором при выполнении каждой команды с плавающей запятой и, установленный, в 1 позволяет, при переключении задач, задержать сохранение или восстановление контекста устройства с плавающей запятой до фактического использования численных данных.

- Бит NT (Nested Task) в регистре флагов EFLAGS. Этот бит, установленный в 1, указывает процессору, что при появлении в программе команды IRET, необходимо осуществить переключение задачи, а не просто возврат из подпрограммы обработки прерывания.

 - Бит B (Busy) в дескрипторе TSS. Этим битом отмечается занятость задач и недопустимость их использования другим процессором в многопроцессорных системах. При переключении задач по командам JMP или IRET, этот бит устанавливается в 1 только в дескрипторе входящей задачи, так как при этом не предусматривается возврат к выходящей задаче. Если же переключение задачи инициирует прерывание или  команда CALL, то бит B устанавливается в состояние 1, в дескрипторах TSS и входящей и выходящей задачи.

                                   Вложения задач

Когда задача инициируется командой  FAR CALL, аппаратным прерыванием или особым случаем, она считается вложенной в ту задачу, которая на нее переключилась. Когда вложенная задача выполняет команду возврата из прерывания IRET, процессор автоматически производит переключение на первоначальную задачу. Практически глубина вложений задач не ограничивается. Переключение задачи с помощью команды FAR JMP не приводит к вложению задач. Связь между вложенными задачами осуществляется через поле Back link (обратная связь) в сегменте TSS. В нем запоминается селектор TSS предыдущей задачи, т.е. старое содержимое регистра TR. Связь между вложенными задачами иллюстрирована рис.VII.4.

           Рис.VII.4. Иллюстрация связи между вложенными задачами.