Хелпикс

Главная

Контакты

Случайная статья





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



mov ax, 24 mov ss, ax

mov ax, 32 mov es, ax

;Инициализируем GS селектором сегмента в расширенной памяти
mov ax, 40
mov gs, ax

;Загрузим селектор TSS 0 в регистр TR
mov ax, 48 ; (26)
ltr ax ; (27)

; Переключимся на задачу 1
call [dword ptr task1_offs] ; (28)

; Сбросим задачу 1 на начало
mov [word ptr tss_1+20h], offset highmem ; (29) Меняем IP

; Изменим атрибут выводимых символов
mov ah, 74h ; (30) Красный на сером фоне
mov [color], ah ; (31)

; Снова вызовим на задачу 1
call [dword ptr task1_offs] ; (32)

; Вывод отладочной информации
mov ax, 0FFFFh
home:
mov si, offset string
debug
mov si, offset string
mov cx, len
mov ah, 74h
mov di, 1600
scr:
lodsb
stosw
loop scr

;Закрыть линию A20
mov al, 0D1h
out 64h ,al
mov al, 0DDh
out 60h, al

;Возврат в реальный ражим
mov eax, CR0
and al, 0FEh
mov CR0, eax

db 0EAh
dw offset return
dw @code
return:
;Восстановим операционную среду реального режима
mov ax, @data
mov ds, ax

mov ax, @stack
mov ss, ax
mov sp, 100h

;Восстановим значение IDTR для работы в реальном режиме
lidt [fword ptr idtr_real]

;Разрешим аппаратные и немаскируемые прерывания
sti
in al, 70h
and al, 07Fh
out 70h, al

mov ah, 09h
mov dx, offset mes
int 21h

mov ax, 4C00h
int 21h

; Процедура заполняющая 2Мб сегмент в расширенной памяти
; Выполняет действия как и в задании ЛР №7.
proc highmem

mov ax, 40 mov gs, ax xor eax, eax xor ebx, ebx mov ecx, 80000h fill: mov [dword ptr gs:ebx], eax

push eax
push cx
mov si, offset number+5
debug
shr eax, 16
mov si, offset number
debug
mov si, offset number
mov cx, 9
mov ah, [color] ; (33) Атрибуты выводимых символов
mov di, 1040
scrh:
lodsb
stosw
loop scrh

pop cx pop eax add ebx, 4 inc eax

db 67h
loop fill_1

jmp go
fill_1:
jmp fill
go:
iret
endp
ends
code_size=$-sttt
end start
end

 

Таблица глобальных дескрипторов дополнена двумя новыми дескрипторами 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 ;Отправим флаги в стек
pop ax ;Извлечем флаги из стека в АХ
mov si, offset string+10 ;Преобразуем в символьную
debug ;форму и выведем на экран

Этот эксперимент может оказаться не очень наглядным, поскольку, как уже отмечалось, в исходном состоянии компьютера флаг NT установлен. Естественно, он останется установленным и после переключения. Для того, чтобы детально изучить роль флага NT, следует сбросить его перед переключением на вложенную задачу. Это можно осуществить командами:

mov ax, 0 ;Обнулим АХ
push ax ;Отправим О в стек
popf ;Перенесем его в регистр флагов

(то, что сбрасываются и остальные флаги, роли не играет). Теперь анализ регистра флагов окажется более поучительным: флаг 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. Результаты выполнения работы.

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.