Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура ЭВМ и систем. Лабораторная работа. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]