Assembler - язык неограниченных возможностей

         

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


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

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

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

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

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

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

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

Для блочных устройств — байт по смещению 0Ah содержит число устройств, поддерживаемых этим драйвером, а остальные байты могут содержать имя драйвера.

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


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

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

+00h: байт — длина буфера запроса (включая заголовок)



+01h: байт — номер устройства (для блочных устройств)

+02h: байт — код команды (00h – 19h)

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

бит 15: произошла ошибка

биты 10 – 14: 00000

бит 9: устройство занято

бит 8: команда обслужена

биты 7 – 0: код ошибки

00h: устройство защищено от записи

01h: неизвестное устройство

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

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

04h: ошибка CRC

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

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

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

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

09h: нет бумаги

0Ah: общая ошибка записи

0Bh: общая ошибка чтения

0Ch: общая ошибка

0Fh: неожиданная смена диска

+05h: 8 байт — зарезервировано

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

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

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


Содержание раздела