Глава 7. Задачи и флаги.
Для управления задачами процессор использует несколько флагов:
Флаг занятости B (Busy) - находится в дескрипторе TSS, в байте прав доступа. Устанавливается всякий раз, когда происходит переключение на задачу и когда установлен, означает, что задача занята. Переключение на занятую задачу запрещено и этот флаг предназначен для предотвращения рекурсивного вызова задачи. Флаг занятости сбрасывается при переключении на другую задачу командами FAR JMP либо IRET; при переключении командой FAR CALL либо при прерывании (даже если обработчик прерывания - тоже задача) флаг не сбрасывается.
| Флаг трассировки T - находится в сегменте состояния задачи TSS, это 0-й бит по смещению 64h в TSS. Если флаг установлен, то при переключении на задачу процессор сначала загрузит значения из всех полей TSS, проверит их правильность и, если не обнаружит нарушений, сгенерирует исключение отладки (прерывание 1). Если флаг сброшен, то при переключении на задачу исключение отладки не генерируется. Этот флаг предназначен для отладки задач и также может применяться для явного системного дополнения контекста задачи, например, для загрузки регистров FPU.
| Флаг NT (Nested Task) - находится в регистре EFLAGS. Если переключение на новую задачу было вызвано командой FAR CALL либо старая задача была прервана исключением или прерыванием и его обработчик также является задачей, то флаг NT устанавливается в регистре EFLAGS новой задачи. Благодаря этому новая задача может вернуть управление старой задаче командой IRET. Команда IRET выполняет одно из двух действий:
|
Флаг TS (Task Switched) - находится в регистре управления CR0. Этот флаг устанавливается каждый раз, когда процессор переключается на задачу и служит индикатором переключения задач. При попытке выполнить команды FPU, MMX или XMM, процессор может генерировать исключение неприсутствующего устройства (#NM - прерывание 7), что позволяет системе выполнить смену контекста FPU, MMX и XMM.
| |
Процессор позволяет пользоваться режимом виртуального 8086 только в контексте задачи и этот режим добавляет некоторые другие флаги, с которыми взаимодействует процессор в задаче, но такой режим процессора довольно сложный и пока мы его рассматривать не будем.
Взаимодействия задач с флагами приведено в таблице 7-1:
Флаг или поле | Эффект от команды JMP | Эффект от команды CALL или прерывания | Эффект от команды IRET |
Флаг B (Busy) новой задачи | Установлен. Перед переходом должен быть сброшен. | Установлен. Перед вызовом должен быть сброшен. | Не меняется. Перед возвратом должен быть установлен. |
Флаг B старой задачи. | Сбрасывается. | Не меняется, он уже установлен | Сбрасывается. |
Флаг NT новой задачи | Не меняется. | Устанавливается. | Восстанавливается из TSS новой задачи. |
Флаг NT старой задачи | Не меняется. | Не меняется. | Сбрасывается. |
Поле Link новой задачи. | Не меняется. | Загружается селектором TSS старой задачи. | Не меняется. |
Поле Link старой задачи. | Не меняется. | Не меняется. | Не меняется. |
Флаг TS в регистре CR0. | Устанавливается. | Устанавливается. | Устанавливается. |
Следующая глава | Оглавление | Вопросы? Замечания? Пишите: sasm@narod.ru |
Copyright © Александр Семенко. |