Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОС_ответы.doc
Скачиваний:
43
Добавлен:
27.10.2018
Размер:
21.59 Mб
Скачать

31 Проаналізуйте структуру драйверу ms dos. Його частини. Завантаження драйверу та робота з ним.

Драйвер устройства в MS-DOS – это подпрограмма, которая вызывается MS-DOS, с одной стороны, и взаимодействует с конкретным устройством, с другой. Как посредник между системой и аппаратурой, драйвер устройства передает данные между программой и устройством.

Базовая структура драйвера устройства показана на рис.1.

Заголовок драйвера

Область данных драйвера

Программа СТРАТЕГИЙ

Вход в программу ПРЕРЫВАНИЙ

Обработчик команд

Программа обработки прерываний

Процедура инициализации

Рис.1-Структура драйвера в MS-DOS

Обязательно должны присутствовать три раздела драйвера – ЗАГОЛОВОК ДРАЙВЕРА, ПРОГРАММА СТРАТЕГИЙ и ПРОГРАММА ПРЕРЫВАНИЙ. Программа ПРЕРЫВАНИЙ это не тоже самое, что программа обработки прерываний, которая может присутствовать в качестве необязательной части работающего по прерываниям драйвера. На самом деле, программа ПРЕРЫВАНИЙ – это точка входа в драйвер для обработки получаемых от MS-DOS команд.

Хотя структура драйвера похожа на структуру .COM программы, важно отметить следующие отличия:

  1. Программа начинается с нулевого смещения, а не 100H.

  2. Образ программы начинается с директив определения данных для заголовка драйвера.

  3. Программа не содержит директивы ASSUME для стекового сегмента.

  4. Программа не содержит директивы END START

Заголовок драйвера

Заголовок драйвера – это блок данных длиной 18 байт, которым должен начинаться любой драйвер. Заголовок драйвера всегда должен располагаться начиная с нулевого смещения в сегменте драйвера. При загрузке драйвера MS-DOS считывает заголовок для того, чтобы определить тип драйвера и точки входа в драйвер. В заголовке драйвера содержится четыре типа сведений, критичных для использования драйвера системой: ПОЛЕ СВЯЗИ, СЛОВО АТРИБУТОВ, ВЕКТОРА ТОЧЕК ВХОДА и ПОЛЕ ИМЕНИ/КОЛИЧЕСТВА.

Поле связи

Первые четыре байта заголовка драйвера это FAR указатель (смещение: сегмент) на следующий драйвер в цепочке (списке) драйверов. При создании драйвера эти байты устанавливаются равными FFFF:FFFF(-1). При загрузке нового драйвера его адрес помещается в поле связи предыдущего драйвера. Исключением являются файлы, содержащие несколько драйверов одновременно. В этом случае первые два байта поля связи должны содержать смещение заголовка следующего драйвера.

Слово атрибутов

Следующее слово заголовка драйвера называется словом атрибутов. Оно содержит ряд однобитовых полей, которые характеризуют тип и возможности драйвера.

Вектора точек входа программ СТРАТЕГИЙ и ПРЕРЫВАНИЙ

Следующие два слова заголовка драйвера содержат смещения программ СТРАТЕГИЙ и ПРЕРЫВАНИЙ, соответственно. MS-DOS использует эту информацию совместно с сегментным адресом драйвера для определения точек входа в указанные программы. Сегментный адрес драйвера система, конечно же, узнает при его загрузке.

Поле имени/количества устройств

Для символьных драйверов это поле содержит ASCII имя устройства, дополненных справа пробелами. Для блоковых устройств имеет значение только первый байт. Он показывает MS-DOS сколько отдельных устройств поддерживается данным драйвером. Такая возможность необходима потому, что многие контроллеры поддерживают более одного физического дисковода. Так как остальные семь байт поля в этом случае не используются, там можно хранить имя устройства для поиска драйвера в памяти или для идентификации драйвера.

Программа СТРАТЕГИЙ.

Единственное назначение программы СТРАТЕГИЙ заключается в сохранении адреса блока запроса для последующего его использования программой ПРЕРЫВАНИЙ. Причина того, что программа СТРАТЕГИЙ обязана сохранять адрес заголовка запроса заключается в том, что MS-DOS выполняет неединственное обращение к драйверу для выполнения определенной команды. На самом деле, система сначала делает предварительное обращение к драйверу для того, чтобы информировать драйвер о том, что он должен сделать и затем делает повторное обращение для выполнения требуемых действий. MS-DOS передает программе СТРАТЕГИЙ адрес блока запроса в регистрах ES:BX. Хотя программа СТРАТЕГИЙ должна сохранять сам блок запроса, большинство драйверов ограничивается сохранением его адреса. Это возможно из-за того, что MS-DOS в настоящее время вызывает программу ПРЕРЫВАНИЙ непосредственно после возврата управления от программы СТРАТЕГИЙ, не изменяя информации в блоке запроса. Как программа ПРЕРЫВАНИЙ так и программа СТРАТЕГИЙ должны быть определены в драйвере как FAR процедуры, возвращая управление MS-DOS, соответственно, командой RETF.

Программа ПРЕРЫВАНИЙ

После того, как программа СТРАТЕГИЙ сохраняет указатель на блок запроса и возвращает управление, MS-DOS вызывает программу ПРЕРЫВАНИЙ. Собственно запрос к драйверу обрабатывается именно этой программой. Самое первое действие, которое должна выполнить программа ПРЕРЫВАНИЙ – это сохранить все регистры. После сохранения текущего состояния процессора, программа ПРЕРЫВАНИЙ должна получить блок запроса, сохраненный программой СТРАТЕГИЙ. Последняя задача программы ПРЕРЫВАНИЙ после обработки требуемой команды заключается в установке статуса возврата в блоке запроса. После этого возвращает управление MS-DOS.

Взаимодействие MS-DOS c драйвером

1. Для обращения к драйверу MS-DOS формирует в собственной области данных запрос к драйверу. Этот запрос состоит из заголовка стандартного формата длиной 13 байт и поля данных произвольного объёма и формата. Формат этой структуры и длина зависят от типа запроса, драйвера, устройства которым управляет драйвер.

2. После этого MS-DOS записывает в регистры ES:BX адрес заголовка запроса.

3. MS-DOS считывает из заголовка драйвера сдвиг программы стратегии драйвера и передаёт ей управление.

4. Программа стратегии записывает адрес заголовка запроса MS-DOS (ES и BX) к переменным reg_seg и reg_off в середине драйвера и организует очередь обслуживания запросов MS-DOS.

5. Непосредственно после вызова программы стратегии MS-DOS вызывает программу обработки прерываний драйвера, определив её адрес из поля interrupt заголовка драйвера.

6. Программа обработки прерываний драйвера извлекает только что записанную программой стратегией адрес заголовка запроса (ES:BX) и выполняет ту функцию из раздела драйвера, где содержатся обработчики команд.

7. Соответствующая функция программы обработки прерываний драйвера записывает результаты работы с устройством в специальные поля заголовка запроса MS-DOS к драйверу.

8. На этом процедура завершена.

Последовательность выполнения программы прерывания драйвера

1. После получения управления от MS-DOS программа прерывания драйвера сохраняет содержимое регистров процессора в стеке и считывает N команды из заголовка запроса MS-DOS к драйверу.

2. При необходимости программа прерывания драйвера считывает информацию из запроса MS-DOS или из заголовка или из изменяемой части.

3. Если команда поддерживается драйвером, то она выполняется.

4. Если драйвер получает данные от физического устройства для передачи их ОС, то программа прерывания драйвера записывает эти данные в специальные структуры в изменяемой части запроса MS-DOS к драйверу.

5. Программа прерывания драйвера устанавливает слово состояния устройства в соответствие к результатам выполнения команды, если драйвер не поддерживает команду, то бит №15 устанавливается в 1, и в биты 0-7 записывается код ошибки 3 – неизвестная команда,

6. Программа прерывания драйвера обновляет состояние регистров ЦП и управление возвращается в MS-DOS.

32 Розробіть програму, що створює новий вектор опрацювання переривання, що виникає при натисканні клавіш <Ctrl+Break>.

.MODEL TINY

.CODE

.STARTUP

jmp init

Handle23h proc

push ds ;сохранить регистры

push ax

push dx

mov ah, 9 ;9 функция DOS: вывод строки на экран

push cs

pop ds

mov dx, offset string1 ;адрес строки

int 21h

pop dx ;восстановить регистры

pop ax

pop ds

iret ;выход из обработчика

Handle23h endp

string1 db 'Ctrl-Break ...',13,10,'$'

;выводимая строка при нажатии Ctrl-Break

old23h dd ? ;адрес предыдущего вектора INT 23h

init:

mov ax, 3523h

;сохранить адрес старого обработчика

int 21h ;прерывания INT 23h

mov word ptr [old23h], bx

;записать в переменную

mov word ptr [old23h+2], es

mov ax, 2523h ;установить обработчик прерывания

mov dx, offset Handle23h ;на процедуру Handle23h

int 21h

mov ax, 3301h ;включить реакцию на нажатие

mov dl, 1 ;Ctrl-Break

int 21h

cicle:

mov ah, 0Bh ;функция DOS проверяющая ввод

int 21h ;с клавиатуры

mov ah, 01h ;функция BIOS проверяющая

int 16h ;нажатие клавиши

jnz cicle

xor ah, ah ;чтение нажатой клавиши

int 16h

cmp ah, 1 ;это была клавиша Esc

jne cicle

mov ax, 2523h ;восстановить вектор прерывания 23h

mov dx, word ptr [old23h+2]

mov ds, dx

mov dx, word ptr [old23h]

int 21h

mov ax, 4c00h ;выход из программы

int 21h

END

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]