Справочник программиста на персональном компьютере фирмы IBM. Ввод/вывод - Создание заголовка драйвера
ОГЛАВЛЕНИЕ
7.2.1 Создание заголовка драйвера.
Драйверы устройств должны создаваться в виде COM файлов
[1.3.6]. Однако они не являются настоящими программами, поскольку
у них отсутствует префикс программного сегмента. Чтобы добиться
этого не надо включать оператор ORG 100H в начале программы, как
это делается для COM файлов. Либо запишите ORG 0, либо вообще
ничего не пишите. Драйвер должен быть описан как далекая (far)
процедура, как и в любой программе. В нижеприведенном примере
приведен начальный код для драйвера устройства с именем DEVICE12.
Оно заменяет стандартное устройство AUX, используемое MS DOS,
принимая вывод функции 4 прерывания 21H. Весь драйвер устройства
состоит из кода этого раздела вместе с кодом, приведенном в сле-
дующих двух разделах; поместите их подряд один за другим, чтобы
получить полную программу.
Драйвер устройства должен начинаться с заголовка драйвера. Он
имеет длину 18 байтов, разделенных на 5 полей. Первое поле (DD)
всегда содержит значение -1 (FFFFFFFFH), и когда MS DOS загружает
драйвер, то оно заменяется на стартовый адрес следующего драйве-
ра. Таким образом, система может искать следующий драйвер по
цепочке. У последнего загруженного драйвера в этом поле остается
значение -1.
Второе поле это байт атрибутов драйвера. Имеют значение только
7 битов этого слова:
бит 15 1 = символьное устройство, 0 = блочное устройство
14 1 = поддерживает IOCTL, 0 = не поддерживает IOCTL
13 1 = формат блоков IBM, 0 = другой формат блоков
3 1 = часы, 0 = не часы
2 1 = нулевое устройство, 0 = не нулевое устройство
1 1 = устройство стандартного вывода, 0 = нет
0 1 = устройство стандартного ввода, 0 = нет
Обычно установлен только бит 15, или биты 15 и 14, если устройст-
во поддерживает IOCTL (как обсуждается в [7.2.4]). Бит 13 уста-
навливается только для блочных устройств. Остальные биты исполь-
зуются для замены устройств, используемых MS DOS по умолчанию
(устройствами стандартного ввода и вывода являются клавиатура и
видеодисплей; устройство часов объединяет часы реального времени
с часами времени суток BIOS; а нулевое устройство (NULL) - это
псевдоустройство, используемое для тестовых целей).
Третье и четвертое поля содержат смещения для процедур страте-
гии и обработки прерывания, которые будут рассмотрены в следующих
разделах. Наконец, последнее поле содержит имя устройства. Имя
может содержать до 8 символов и оно должно быть выравнено по
левому краю с завершающими пробелами. Для замены существующих в
DOS устройств, таких как LPT1 или COM1, используйте то же имя
устройства, как в данном примере.
Низкий уровень.
В данном примере создается драйвер для последовательного уст-
ройства. "DEVICE12" - имя файла, который должен быть указан в
файле конфигурации сиситемы, чтобы этот драйвер был загружен. В
байте атрибутов установлен только бит 15, указывая что это сим-
вольное устройство и что оно не поддерживает IOCTL. DEV_STRATEGY
и DEV_INTERRUPT - имена процедур, обсуждаемых в следующих разде-
лах. Устройство названо AUX, с тем чтобы заменить обычное уст-
ройство MS DOS с этим именем. Это позволяет очень просто обра-
щаться к этому устройству, поскольку система имеет предопределен-
ный номер файла для обращения к устройству AUX (последовательно-
му). В пример включен начальный код для драйвера, определяющий
его как COM программу.
CSEG SEGMENT PUBLIC 'CODE' 'устанавливаем кодовый сегмент
ORG 0 'эта строка необязательна
ASSUME CS:CSEG,DS:CSEG,ES:CSEG
DEVICE12 PROC FAR 'драйвер это далекая процедура
DD 0FFFFFFFFH 'адрес следующего драйвера
DW 8000H 'байт атрибутов
DW DEV_STATEGY 'адрес процедуры стратегии
DW DEV_INTERRUPT 'адрес процедуры прерывания
DB 'AUX ' 'имя устройство (дополненное пробелами)