Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Архитектура ЭВМ и систем. Лабораторная работа. Учебное пособие
.pdf
04 Ошибка контрольной суммы
05 Неверная структура запроса
09 Конец бумаги в принтере
0А Ошибка при выводе
0В Ошибка при вводе
0С Общая неисправность
Операции драйвера
При вызове программы стратегии в ES:BX передается адрес заголовка запроса. Программа обработки прерываний получает указатели на заголовки запроса из очереди, в которую они помещаются
программой стратегии. Код операции в заголовке запроса указывает
драйверу, какие действия необходимо выполнить.
Примечание: все указатели имеют формат ДВОЙНОЕ СЛОВО.
В первом слове содержится смещение, во
втором – сегмент.
Операция инициализации INIT
Код операции = 0. В ES:BX передается адрес запроса. Структура запроса приведена в следующей таблице.
Поле Длина
Заголовок запроса 13 байтов
Количество логических устройств (не за-
1 байт
дается для посимвольных устройств)
Адрес конца резидентной части програм-
Двойное слово
мы
Указатель на массив указателей на BPB
Двойное слово
(не задается для посимвольных устройств)
Номер устройства (не задается для по-
1 байт
символьных устройств)
Драйвер должен выполнить следующие действия:
1) выполнить необходимые действия по инициализации (для модема, принтера и т.д.);
2) установить адрес конца резидентной части драйвера;
3) установить слово состояния в заголовке запроса.
111

Для того чтобы получить информацию, переданную из
CONFIG.SYS в драйвер устройства при выполнении операции INIT,
в поле указателя BPB имеется указатель на буфер, содержащий
строку, следующую в CONFIG.SYS за знаком "=". Данная строка
может заканчиваться символом «возврат каретки» (0DH) или символом «конец строки» (0AH). Указанная информация доступна лишь
для чтения.
Программа INIT может выполнять только системные вызовы
01H-0CH и 30H.
Если программа INIT обнаружит, что устройство невозможно
установить и требуется завершение работы с освобождением памяти, то должны быть выполнены следующие действия:
1) установить смещение адреса конца резидентной части равным 0;
2) установить сегмент адреса конца резидентной части равным зна-
чению CS.
Примечание: если в одном файле содержится несколько драй-
веров устройств, то DOS
использует адрес конца драйвера, полученный из последнего вызова INIT. При этом рекомендуется, чтобы все
драйверы в таком модуле возвращали одно и то же значение этого
адреса.
Операции ввода (INPUT) и вывода (OUTPUT)
Коды операций = 3, 4, 8, 9 и 12. В ES:BX – адрес запроса.
Поле Длина
Заголовок запроса 13 байтов
Байт описания типа носителя 1 байт
Адрес буфера Двойное слово
Счетчик байтов/секторов Слово
Номер начального сектора Слово
Указатель на идентификатор диска Двойное слово
Драйвер должен выполнить следующие действия:
1) сформировать слово состояния в заголовке запроса;
2) выполнить запрошенную операцию;
3) заполнить «счетчик байтов» фактическим числом переданных бай-
тов.
112

Примечание: для IOCTL-операций контроль на ошибки не производится. Однако драйвер должен заполнить поле «счетчик байтов»
фактическим числом переданных байтов.
Опережающий ввод без ожидания
Код операции = 5. В ES:BX – адрес запроса.
Поле Длина
Заголовок запроса 13 байтов
Байт, считанный из устройства 1 байт
Драйвер должен выполнить следующие действия:
1) вернуть байт, полученный от устройства;
2) сформировать слово состояния в заголовке запроса.
Если посимвольное устройство устанавливает бит занятости в 0
(символы в буфере), то возвращается следующий символ, который
должен быть введен из устройства обычной операцией ввода. Этот
символ не удаляется из буфера – отсюда и название «неразрушаю
щий», или «опережающий ввод». Эта операция позволяет «заглянуть» DOS на один символ вперед.
Опрос состояния готовности (STATUS)
Коды операций = 6 и 10. В ES:BX – адрес запроса.
Поле Длина
Заголовок запроса 13 байтов
Драйвер должен выполнить следующие действия:
1) выполнить запрошенную операцию;
2) установить бит занятости/готовности.
3) сформировать слово состояния в заголовке запроса.
Бит занятости используется следующим образом. При выводе
на посимвольное устройство: если бит занятости равен 1, то запрос
на вывод должен ожидать завершения обработки текущего запроса.
Если бит занятости равен 0, то в данный
момент никакой запрос не
-
113

выполняется, и запрос на вывод данных может быть немедленно
выполнен.
При вводе из символьного устройства с буферизацией, если бит
занятости равен 1, то запрос на ввод направляется непосредственно
на устройство. Если бит занятости равен 0, то данные уже находятся
в буфере устройства, и ввод выполнятся быстро. Это также указывает, что что-то
введено. DOS считает, что все посимвольные устройства выполняют ввод через входной буфер. Устройства, которые не
имеют такого буфера, должны всегда устанавливать этот бит в 0, для
того, чтобы DOS не повисла в ожидании занесения информации в
буфер, которого не существует.
Операция подавления невыполненных запросов (FLUSH)
Коды операций = 7 и 11. В ES:BX – адрес запроса.
Поле
Длина
Заголовок запроса 13 байтов
Этот запрос требует от драйвера исключить из очереди все запросы, ожидающие выполнения, и используется чаще всего для очистки очереди запросов на ввод из посимвольного устройства.
Перед возвратом драйвер должен сформировать слово состояния в заголовке запроса.
Операция «Открыть (OPEN)» и «Закрыть (CLOSE)»
Коды операций = 13 и 14. В ES:BX – адрес запроса.
Поле
Длина
Заголовок запроса 13 байтов
Операция «Открыть» может использоваться для вывода в устройство инициализирующей последовательности. Для устройства
печати, например, это может быть установка шрифта, размера страницы и т.д. Таким образом, до начала печати принтер всегда будет
подготовлен. Аналогично, операция «Закрыть» может быть исполь-
114

зована для вывода в устройство завершающей последовательности
(например, установка на начало новой страницы) после завершения
ввода/вывода. Использование IOCTL-операции обеспечивает гибкий
механизм для управления последовательными устройствами.
Обобщенный IOCTL-запрос
Код операции = 15. В ES:BX – адрес запроса.
Поле Длина
Заголовок запроса 13 байтов
Основная функция Байт
Дополнительная функция Байт
Содержимое регистра SI Слово
Содержимое регистра DI Слово
Указатель на пакет запроса основного IOCTL
Драйвер поддерживает функции, которые могут быть запрошены (DOS функцию 44H прерывания 21H для передачи IOCTL- вызова).
Пример драйвера
Ниже приведен пример простого драйвера, выводящего при
инициализации строку «Здравствуй, мир» и выгружающегося сразу
вслед за этим:
_text SEGMENT PARA PUBLIC 'text'
ASSUME cs:_text,ds:_text,es:_text
DriverHeader LABEL FAR ;заголовок
драйвера
NextDriver dd -1 ;следующий
драйвер
Attributes dw 8000H ;атрибуты
StrategyPtr dw Strategy ;стратегия
InterruptPtr dw Interrupt ;прерывание
DriverName db 'HELLO' ;название
драйвера
;
115

QueryPtr dw 0,0 ;указатель
на заголовок запроса
;приветственное сообщение
StartMessage db 0DH,0AH,'Здравствуй,
мир !!!'
db 0DH,0AH,'$'
;
;подпрограмма выбора стратегии обработки запросов
Strategy PROC FAR
;сохраним указатель на запрос
mov [cs:QueryPtr],bx
mov [cs:QueryPtr+2],es ;
ret
Strategy ENDP
;
;подпрограмма обработки прерывания
Interrupt PROC FAR
push es
push ds
push bx
push ax
;сохраненный указатель на запрос
mov bx,cs:[QueryPtr]
mov es,cs:[QueryPtr+2]
;какая команда?
cmp byte ptr es:[bx+2],0
jne Error
;инициализация драйвера
push cs ;установим
сегмент данных
pop ds
mov ah,9 ;выведем
приветственное сообщение
lea dx,[StartMessage]
int 21H
;общая неисправность
mov word ptr es:[bx+3],
800CH
jmp Finish
116

Error:
;недопустимая команда
mov word ptr es:[bx+3],
8003H
Finish:
;адрес конца резидентной части
(выгружаем драйвер)
mov word ptr es:[bx+14],0
mov word ptr es:[bx+16],cs
pop ax
pop bx
pop ds
pop es
ret
Interrupt ENDP
_text ENDS
END DriverHeader
Задания для выполнения
К каждому выполненному заданию должны прилагаться:
1) описание формата команд драйвера и входных/выходных данных;
2) листинг драйвера и тестирующей программы;
3) тестовая программа, осуществляющая проверку работы драйвера;
4) тестовый пример и его
Задание № 1.
шин от несанкционированного доступа при помощи проверки пароля. При загрузке драйвер спрашивает пароль. Пользователю дается
три попытки. Если пароль введен верно, то драйвер выгружается из
памяти и возвращает управление системе. Если пользователь пароля
не знает, то загрузка системы прекращается путем завешивания машины. Пароль задается
команды установки драйвера в файле CONFIG.SYS. Создать отдельную утилиту для создания зашифрованных паролей.
Задание № 2. Написать драйвер некоторого виртуального устройства, осуществляющего преобразование поступающих на вход
символов из нижнего регистра в верхний и выдающего их на выходе
Написать драйвер, осуществляющий защиту ма-
описание.
в зашифрованном виде в качестве параметра
117

в той же последовательности. Устройство имеет буфер определенного размера, при переполнении которого вызывающей программе
выдается сигнал ошибки.
Задание № 3. Написать драйвер некоторого виртуального устройства, осуществляющего преобразование поступающих на вход
символов из верхнего регистра в нижний и выдающего их на выходе
в той же последовательности. Устройство имеет буфер определен
ного размера, при переполнении которого вызывающей программе
выдается сигнал ошибки.
Задание № 4. Написать драйвер некоторого виртуального устройства, перенаправляющего поступающий на вход поток символов
на экран с заданными атрибутами. Устройство имеет определенный
набор команд, позволяющий управлять установкой атрибутов. Посылка команд в устройство осуществляется с помощью IOCTLвызовов.
Задание № 5.
Написать драйвер некоторого виртуального шифровального устройства, имеющего два режима работы: шифровка и
расшифровка. В первом режиме оно осуществляет преобразование
поступающих на вход символов в зашифрованную последовательность и выдает их на выходе. Во втором – таким же образом происходит расшифровка. Устройство имеет буфер определенного размера, при переполнении которого вызывающей
программе выдается
сигнал ошибки. Установка режима работы устройства производится
при помощи IOCTL-вызовов.
Задание № 6. Написать драйвер некоторого виртуального устройства, выводящего поступающий на вход поток символов на экран
в область с заданными координатами. Устройство имеет определенный набор команд, позволяющий устанавливать координаты области вывода и начальную позицию в ней
. Посылка команд в устройст-
во осуществляется с помощью IOCTL-вызовов.
Задание № 7. Написать драйвер некоторого виртуального устройства, осуществляющего замену в поступающем на вход тексте
символов табуляции на соответствующее количество пробелов и
-
118

выдающего его на выход. Устройство имеет буфер определенного
размера, при переполнении которого вызывающей программе выдается сигнал ошибки.
Задание № 8. Написать драйвер некоторого виртуального устройства, выдающего поступившие на вход символы по принципу
«последний вошел – первый вышел». Устройство имеет буфер определенного размера, при переполнении которого вызывающей программе выдается
сигнал ошибки.
Задание № 9. Написать драйвер виртуального счетного устройства, выполняющего простейшие арифметические операции: сложение, вычитание, деление, умножение, двоичный сдвиг. Разработать
систему команд, формат передачи задания для выполнения и возврата результата. Диалог с драйвером устройства рекомендуется осуществлять с участием IOCTL-вызовов.
Задание № 10. Написать драйвер виртуального счетного
устройства, осуществляющего прием на вход произвольного набора
целых чисел и выдающего на выходе их медиану и дисперсию
(можно использовать для вычислений целочисленные арифметические операции). Разработать систему команд, формат передачи задания данных в устройство и получения результата. Диалог с драйвером устройства должен осуществляться с использованием IOCTLвызовов.
Задание
№ 11. Написать драйвер виртуального устройства,
осуществляющего вывод на экран любого передаваемого слова
большими буквами, нарисованными звездочками. Разработать систему команд и формат описания задания. Диалог с драйвером устройства должен осуществляться с использованием IOCTL-вызовов.
Задание № 12. Написать драйвер виртуального шифровального
устройства, шифровку и расшифровку файлов на диске. Разработать
систему команд
и формат описания задания. Диалог с драйвером
устройства должен осуществляться с использованием IOCTLвызовов.
119

Задание № 13. Написать драйвер виртуального устройства,
осуществляющего вывод на экран в графическом режиме заданную
последовательность из точек и линий. Разработать систему команд
для управления режимом графического адаптера, передачей данных
и рисованием. Диалог с драйвером устройства должен осуществляться с использованием IOCTL-вызовов.
Задание № 14. Написать драйвер виртуального устройства,
осуществляющего вычисление факториала
заданного числа. Разработать систему команд и формат описания задания и выдачи результата. Диалог с драйвером устройства должен осуществляться с использованием IOCTL-вызовов.
Задание № 15. Написать драйвер виртуального устройства,
осуществляющего перевод знаковых и беззнаковых 32-битных чисел
из двоичного формата в символьный шестнадцатеричный и десятичный. Разработать систему команд и формат
описания задания и выдачи результата. Диалог с драйвером устройства должен осуществляться с использованием IOCTL-вызовов.
Задание № 16. Написать драйвер виртуального устройства,
осуществляющего перевод знаковых и беззнаковых 32-битных чисел
из символьного шестнадцатеричного и десятичного форматов в двоичный. Разработать систему команд и формат описания задания и
выдачи результата. Диалог с
драйвером устройства должен осуще-
ствляться с использованием IOCTL-вызовов.
Задание № 17. Написать драйвер виртуального устройства,
осуществляющего перекодировку заданного текстового файла на
диске из кодировки DOS (866) в кодировку Windows (1251). Разработать систему команд и формат описания задания. Диалог с драйвером устройства должен осуществляться с использованием IOCTLвызовов.
Задание № 18. Написать драйвер виртуального устройства,
осуществляющего перекодировку заданного текстового файла на
диске из кодировки Windows (1251) в кодировку DOS (866). Разработать систему команд и формат описания задания. Диалог с драй-
120
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
