Страница 17 из 27
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 ' 'имя устройство (дополненное пробелами)
|