2. Переключение задач
П ереключение задач осуществляется командами межсегментной передачи управления, при обработке прерываний и возврате из обработчиков. Если при этом управление передается дескриптору сегмента состояния задачи или шлюзу задачи, то происходит переключение задач. В соответствии с содержимым обязательной части TSS производится загрузка регистров МП, и он начинает выполнение поступившей задачи.
Шлюз задачи имеет формат (рис. 5).
Рис. 5. Формат шлюза задачи
Он имеет статус системного объекта, его тип в байте доступа с значением 0101.
Переключение задач похоже на вызов процедуры, но сохраняется больше информации. Информация о состоянии МП сохраняется в TSS, а не в стеке.
Обращение к TSS осуществляется путем загрузки в регистр TR селектора, который адресует размещенный в GDT дескриптор TSS соответствующей задачи. Обычно команда LTR загрузки TR используется только при инициали-зации системы для установки начального содержимого TR. В дальнейшем этот регистр загружается МП при выполнении команд, переключающих задачу.
► При переключении задач проверяются привилегии, установленные для доступа к данным: DPL max (CPL, RPL), т. е. допускается переключение на задачи, чья степень защиты меньше или равна уровню привилегий текущей программы и запроса.
Как правило, поле DPL дескриптора TSS равно 0, поэтому переключение задач могут производить только привилегированные программы.
► Для переключения на задачи с большим приоритетом используется механи-зм шлюзов задач, аналогичный шлюзам вызова. При этом необходимо сохранение стеков более привилегированных задач, что и осуществляется с помощью сохранения SSi, ESPi в сегменте состояния задачи.
Для переключения задач в командах межсегментных переходов можно указать ▪селектор шлюза задачи (косвенное переключение задачи) или ▪селектор дескриптора TSS (прямое переключение без привлечения шлюза задачи). Принципиальной разницы между этими переключениями нет. Но обычно цель использования шлюза задачи связана с мультизадачностью.
Так как для каждой задачи имеется единственный дескриптор TSS, который должен находиться в глобальной таблице GDT, все достаточно привилегированные задачи имеют к нему доступ и могут произвести переключение задачи.
● Но если определить для данного дескриптора TSS несколько шлюзов задачи и разместить их в различных LDT, можно разрешить переключать задачи только тем задачам, которые имеют шлюз задачи в своих LDT. При этом сохраняется доступ к дескриптору TSS для программ с нулевым уровнем привилегий, которые могут прямо обращаться к нему в GDT.
► Рассмотрим теперь переключение задач более подробно на примере механизма прямого переключения (рис. 6).
В общем случае команда межсегментного перехода содержит 3 поля:
поле кода операции (JMP - безусловный переход, CALL - переход с возвратом),
селектор нового сегмента команд, который заносится в сегментный регистр CS, и
Рис. 6. Механизм прямого переключения задач
поле смещения, содержи-мое которого заносится в регистр-указатель команд EIP.
При переключении задач выполняется последовательность действий:
В случае, когда тип дескриптора, определяемого вторым полем команды перехода, указывает, что данный дескриптор является дескриптором TSS и новая задача не занята (В = 0), запускается механизм переключения задач. В этом случае поле смещения в команде игнорируется.
В теневом регистре регистра задач TR МП к данному моменту содержится дескриптор TSS исполняемой задачи. Его поле адреса указывает на область памяти, где должно быть сохранено состояние текущей задачи. Микропроцессор записывает в этот сегмент необходимую информацию.
Дескриптор TSS новой задачи переписывается из глобальной таблицы дескрипторов в теневой регистр регистра задач МП. Этот дескриптор определяет положение в памяти сегмента состояния новой задачи.
Информация о новой задаче переписывается из своего TSS в регистры микропроцессора.
Если команда, вызвавшая переключение задач, предполагает последующий возврат к старой задаче (CALL), то в поле селектора возврата TSS входящей задачи заносится содержимое регистра TR снимаемой с обработки задачи. При этом устанавливается значение бита вложенной задачи NT = 1 в регистре флагов EFLAGS.
В регистр TR МП из второго поля команды заносится селектор дескриптора TSS новой задачи.
● Использование флага вложенной задачи NT и бита занятости B позволяет организовать корректную обработку вложенных задач. Порядок установки этих бит в зависимости от типа команды, вызвавшей переключение задач, указан в табл. 3.
Таблица 3. Модификация флагов занятости и вложенности при переключении задач |
|||||
Тип команды |
Входящая задача |
Выходящая задача |
|||
Флаг NT в EFLAGS |
Бит в дескрипторе TSS |
Флаг NT в EFLAGS |
Бит в дескрипторе TSS |
||
CALL |
1 |
1 |
X |
1 |
|
JMP |
0 |
1 |
X |
0 |
◊ Команда CALL устанавливает B = 1 для новой задачи и сохраняет B = 1 для предыдущей. Таким образом, каждая задача в цепи вызовов оказывается занятой, что запрещает применение рекурсивных процедур и реентерабельных программ.
◊ Команда JMP при переключении на новую задачу не сохраняет в TSS селектор возврата и устанавливает NT = 0, а также B = 0 в дескрипторе старой задачи и B = 1 в дескрипторе новой задачи.
● Возврат из задачи осуществляется по команде IRET, которая анализирует флаг NT и при NT = 1 осуществляет переключение на задачу, задаваемую селектором возврата в TSS текущей задачи.
При NT = 0 осуществляется обычная процедура возврата из процедуры с восстановлением из стека содержимого CS, EIP, EFLAGS.
● Обычная команда RET возврата из подпрограммы не учитывает вложения задач.
Краткие итоги.
Рассмотрены принципы организации мультипрограммного режима обработки информации,
Представлены аппаратные средства микропроцессора, используемые для поддержки мультипрограммирования,
Разобран механизм переключения задач.
Лекция 7, часть 2