5.11. Драйверы устройств в DOS

Итак, в предыдущих разделах говорилось о том, как происходит работа с неко­торыми устройствами на самом низком уровне - уровне портов ввода-вывода. Од­нако прикладные программы обычно никогда не используют это уровень, а обра­щаются ко всем устройствам через средства операционной системы. DOS, в свою очередь, обращается к средствам BIOS, которые осуществляют взаимодействие на уровне портов со всеми стандартными устройствами. Фактически процедуры BIOS и выполняют функции драйверов устройств - программ, осуществляющих интерфейс между операционной системой и аппаратной частью компьютера. BIOS обычно лучше всего известно, как управлять устройствами, которые постав­ляются вместе с компьютером, но, если требуется подключить новое устройство, о котором BIOS ничего не знает, появляется необходимость в специально напи­санном загружаемом драйвере.

Драйверы устройств в DOS - исполняемые файлы со специальной структу­рой, которые загружаются на этапе запуска (при выполнении команд DEVICE или DEVICEHIGH файла config.sys) и становятся фактически частью системы. Драйвер всегда начинается с 18-байтного заголовка:

+00: 4 байта - дальний адрес следующего загружаемого драйвера DOS - так как в момент загрузки драйвер будет последним в цепочке, адрес дол­жен быть равен OFFFFh:OFFFFh

+04: 2 байта - атрибуты драйвера

+06: 2 байта - адрес процедуры стратегии

+08: 2 байта - адрес процедуры прерывания

+0Ah: 8 байт - имя драйвера для символьных устройств (дополненное пробелами)

для блочных устройств - байт по смещению OAh включает число устройств, поддерживаемых этим драйвером, а остальные байты

могут содержать имя драйвера

Здесь следует заметить, что DOS поддерживает два типа драйверов - символь­ного и блочного устройств. Первый тип используется для любых устройств -клавиатуры, принтера, сети, а второй - только для устройств, на которых могут существовать файловые системы, то есть для дисководов, RAM-дисков, нестан­дартных жестких дисков, для доступа к разделам диска, занятым другими опера­ционными системами, и т. д. Для работы с символьным устройством программа

должна открыть его при помощи функции DOS «открыть файл или устройство», а для работы с блочным устройством - обратиться к соответствующему логичес­кому диску.

Итак, код драйвера устройства представляет собой обычный код программы, как и в случае с СОМ-файлом, но в начале не надо размещать директиву org 100h для пропуска PSP. Можно также объединить драйвер и исполняемую программу,яшм

разместив в ЕХЕ-файле код драйвера с нулевым смещением от начала сегмента, а точку входа самой программы ниже.

При обращении к драйверу DOS сначала вызывает процедуру стратегии (ад­рес по смещению 06 в заголовке), передавая ей адрес буфера запроса, содержа­щий все параметры, передаваемые драйверу, а затем процедуру прерывания (ад­рес по смещению 08) без каких-либо параметров. Процедура стратегии должна сохранить адрес буфера запроса, а процедура прерывания - собственно выпол­нить все необходимые действия. Структура буфера запроса меняется в зависимо­сти от типа команды, передаваемой драйверу, но структура его заголовка остается

постоянной:

+00h: байт - длина буфера запроса (включая заголовок) +01h: байт - номер устройства (для блочных устройств) +02h: байт - код команды (00h - 19h)

+03h: 2 байта - слово состояния драйвера - должно быть заполнено драйвером

бит 15: произошла ошибка биты 10-14: 00000b

бит 9: устройство занято бит 8: команда обслужена биты 7-0: код ошибки

OOh: устройство защищено от записи Olh: неизвестное*устройство

02h: устройство не готово

03h: неизвестная команда

04h: ошибка CRC

05h: ошибка в буфере запроса

06h: ошибка поиска

07h: неизвестный носитель

08h: сектор не найден

09h: нет бумаги OAh: общая ошибка записи OBh: общая ошибка чтения ОСЬ: общая ошибка OFh: неожиданная смена диска +05h: 8 байт - зарезервировано

отсюда начинается область данных, отличающаяся для разных команд

Даже если драйвер не поддерживает запрошенную от него функцию, он обяза­тельно установить бит 8 слова состояния в

Рассмотрим символьные и блочные драйверы на конкретных примерах.