|
|||
mov ax, 24 mov ss, ax. mov ax, 32 mov es, ax. mov ax, 40 mov gs, ax xor eax, eax xor ebx, ebx mov ecx, 80000h fill: mov [dword ptr gs:ebx], eax. pop cx pop eax add ebx, 4 inc eax ⇐ ПредыдущаяСтр 4 из 4 mov ax, 24 mov ss, ax mov ax, 32 mov es, ax ;Инициализируем GS селектором сегмента в расширенной памяти ;Загрузим селектор TSS 0 в регистр TR ; Переключимся на задачу 1 ; Сбросим задачу 1 на начало ; Изменим атрибут выводимых символов ; Снова вызовим на задачу 1 ; Вывод отладочной информации ;Закрыть линию A20 ;Возврат в реальный ражим db 0EAh mov ax, @stack ;Восстановим значение IDTR для работы в реальном режиме ;Разрешим аппаратные и немаскируемые прерывания mov ah, 09h mov ax, 4C00h ; Процедура заполняющая 2Мб сегмент в расширенной памяти mov ax, 40 mov gs, ax xor eax, eax xor ebx, ebx mov ecx, 80000h fill: mov [dword ptr gs:ebx], eax push eax pop cx pop eax add ebx, 4 inc eax db 67h jmp go
Таблица глобальных дескрипторов дополнена двумя новыми дескрипторами gdt_tss_0 и gdt_tss_l. Это дескрипторы сегментов состояния задач TSS. В нашем примере используются TSS минимального размера – по 104 байта, поэтому в поле границы дескрипторов TSS указано число 103. Атрибут 1 дескрипторов имеет значение 89h: присутствующий, уровень привилегий DPL=0, свободный TSS МП 486 (рис. 6.5).
Рисунок 6.5 – Расшифровка значения атрибута для дескриптора TSS
Вспомним, что дескриптор TSS может быть четырех типов: свободный TSS МП 286, занятый TSS МП 286, свободный TSS МП 386/486 и занятый TSS МП 386/486. Описывая сегменты состояния задач в таблице дескрипторов, с помощью кода типа указывают, что они свободны. Как только селектор дескриптора TSS будет загружен в регистр задачи TR, процессор изменяет код атрибута дескриптора этого TSS, объявляя его занятым. При этом TSS исходной задачи остается занятым до ее завершения, даже если выполняются переключения на другие задачи. TSS вложенной задачи помечается процессором, как занятый, как только произойдет переключение на эту задачу, а после ее завершения и возврата в исходную задачу TSS вложенной задачи снова освобождается. Попытка переключения на задачу, TSS который занят, приводит к исключению нарушения общей защиты. Тем самым предотвращается повторный запуск активной задачи. В сегменте данных главной задачи зарезервировано место для двух сегментов состояния задач. Там же предусмотрено двухсловное поле адреса для команды call dword ptr переключения на вложенную задачу. Поскольку переключение осуществляется через TSS задачи, в качестве сегментного адреса задачи указывается селектор ее TSS (в данном случае 56). Слово со смещением при переключении задач игнорируется, хотя должно присутствовать в программе согласно формату команды call. Перед переключением на задачу 1 следует инициализировать некоторые поля TSS_1 (TSS_0 будет заполнен процессором при первом возврате из вложенной задачи в исходную). В данном примере инициализация TSS_1 выполняется еще в реальном режиме, хотя эту операцию можно было бы перенести в защищенный режим. Поля для CS и IP заполняются селектором сегмента команд задачи 1 (в данном случае это общий для обеих задач сегмент с селектором 16) и смещением highmem точки входа в задачу 1. Для стека задачи 1 произвольно выделена область, начиная с середины нашего сегмента стека. Поскольку задача 1 будет использовать общий сегмент данных и обращаться к видеобуферу, ей передаются селекторы этих сегментов. Далее следуют уже рассмотренные ранее операции запрета прерываний, подготовки адреса возврата в реальный режим, загрузки регистра IDTR, открытия линии А20 и перехода в защищенный режим. После перехода в защищенный режим и выполнения обычных процедур инициализации сегментных регистров в регистр задачи TR загружается селектор TSS исходной задачи. Переключение на вложенную задачу можно будет выполнить и без этого, однако загрузка TR обеспечит возврат из вложенной задачи в исходную. Наконец, командой дальнего косвенного вызова осуществляется переключение на задачу 1, в качестве которой выступает процедура highnicm, размещенная в самом конце сегмента команд. Задача 1 заполняет расширенную память последовательными числами, выводя их одновременно на экран, что позволяет наглядно контролировать ее работу. Завершающая команда iret этой задачи осуществляет обратное переключение, передавая управление на очередную команду задачи 0, следующую за командой дальнего вызова. Здесь продемонстрирована техника повторного переключения на задачу 1: в поле TSS для указателя команд восстанавливается начальный адрес процедуры highmem и снова выполняется команда дальнего вызова. Продолжение исходной задачи не отличается от предыдущего примера. Отладочная макрокоманда debug, используемая в программе, дает возможность детально изучить процесс переключения задач и участие в этом процессе различных системных структур. Можно выполнить анализ следующих объектов. 1. Содержимое области связи в TSS_1 до переключения на задачу 1 и после этого переключения. До переключения эта область пуста, а после переключения в ней должен быть записан селектор TSS_0 (48=30h) 2. Значение кода атрибута в дескрипторах сегментов состояния задач. До активизации задачи код должен быть равен 89h, после активизации - 8Bh, поскольку сегмент становится занятым. 3. Состояние регистра флагов и, в частности, флага NT, до переключения на вложенную задачу, "внутри нее" и после возврата в исходную задачу. Вывести на экран содержимое регистра флагов (нас будет интересовать только его младшее слово) можно следующим образом: pushf ;Отправим флаги в стек Этот эксперимент может оказаться не очень наглядным, поскольку, как уже отмечалось, в исходном состоянии компьютера флаг NT установлен. Естественно, он останется установленным и после переключения. Для того, чтобы детально изучить роль флага NT, следует сбросить его перед переключением на вложенную задачу. Это можно осуществить командами: mov ax, 0 ;Обнулим АХ (то, что сбрасываются и остальные флаги, роли не играет). Теперь анализ регистра флагов окажется более поучительным: флаг NT будет сброшен при выполнении задачи 0, но установлен при выполнении задачи 1. После возврата в задачу 0 флаг снова сбросится, так как именно такое состояние регистра флагов будет храниться в TSS_0. Чтобы проанализировать процесс сохранения и восстановления содержимого регистра флагов, можно после очистки регистра флагов принудительно установить в нем какой-либо флаг, например CF (что можно выполнить командой stc) и вывести на экран, кроме слова флагов, еще и содержимое ячеек TSS_0 и TSS_1 со смещением 24h. 4. Процесс передачи параметров в вызываемую задачу через ее TSS. Для этого можно заполнить какими-либо числами поля TSS_1, предназначенные для хранения содержимого регистров общего назначения, и проанализировать содержимое этих регистров при входе в задачу 1. 3 Контрольные вопросы 1. Что понимают под задачей? 2. На какие аппаратные и программные средства опирается организация многозадачного режима? 3. Что представляет собой сегмент состояния задачи (TSS), каков его формат? 4. Что представляет собой шлюз задачи? 5. Какие действия происходят при переключении задачи? 6. Для чего предназначен флаг NT? 7. Как осуществляется связь между задачами? 4 Задание 1. Изучить теоретические основы использования многозадачного режима. 2. Набрать и отладить и протестировать предложенную программу с использованием переключения задач. При этом обратить внимание на следующие этапы: 2.1. Определение таблицы дескрипторов и дескрипторов используемых сегментов. 2.2. Определение TSS задач. 2.3. Определение переменной для переключения на задачу 2.4. Подготовка таблицы дескрипторов к переходу в защищенный режим. 2.5. Подготовка дескрипторов сегментов TSS. 2.6. Подготовка TSS дочерней задачи. 2.7. Структура процедуры дочерней задачи. 2.8. Переключение на дочернюю задачу 2.9. Повторное переключение на дочернюю задачу 2.10. Подготовка к возврату и возврат в реальный режим 3. Модифицировать программу, добавив дополнительное переключение между задачами. 4. Отладить и протестировать полученную программу. 5. Оформить отчёт. 5 Содержание отчета 1. Титульный лист. 2. Краткое теоретическое описание. 3. Задание на лабораторную работу. 4. Листинг программы. 5. Результаты выполнения работы.
|
|||
|