Таким образом, программное инициирование переключения задачи напоминает обычный вызов подпрограмм, однако процесс обработки происходит, в этих случаях, совсем по-другому. При вызове подпрограммы ей обычно передаются некоторые параметры, а после ее выполнения она возвращает в основную программу определенные результаты. Кроме того, процедура обработки прерывания всегда возвращает управление прерванной программе.
При переключении задач, управление передается другой задаче, совершенно не связанной с предыдущей. Никакого обмена информацией между ними в этом случае не происходит, и они полностью независимы друг от друга.
В заключение, для более четкого представления о процедуре переключения задач, опишем последовательность основных действий, которые при этом происходят.
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. Иллюстрация связи между вложенными задачами.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.