Справочник программиста на персональном компьютере фирмы IBM. Ввод/вывод - Создание драйвера устройства
ОГЛАВЛЕНИЕ
Раздел 2. Создание драйвера устройства.
Драйвер устройства это специальная программа, которая управ-
ляет обменом с периферийным устройством, таким как принтер или
дисковый накопитель. Поскольку параметры этих периферийных уст-
ройств меняются от производителя к производителю, то разным поль-
зователям программы может потребоваться дюжина различных драйве-
ров, чтобы он мог работать на имеющемся у него оборудовании.
Имеется 4 способа включения драйверов устройств в программу:
1. Можно поместить код для всех драйверов прямо в программу.
Например, чтобы поддерживать различные принтеры, можно создать
таблицу управляющих последовательностей и искать в ней нужный код
каждый раз когда он потребуется. Этот подход тратит много памяти
и может быть достаточно медленным.
2. Создать ряд драйверов устройств и потребовать, чтобы прог-
рамма загружала необходимый в качестве оверлея (т.е. помещать его
в область программы, специально оставленную для этой цели
[1.3.5]).
3. Создать драйвер устройства как отдельную программу, которая
указывается в командном файле, выполняемом при загрузке системы.
Программа запускается и устанавливает драйвер устройства как
программу обработки прерывания. После этого программа завершает-
ся, но остается резидентной в памяти, как объяснено в [1.3.4].
Впоследствии наша программа использует этот драйвер через вектор
прерывания.
4. Создать полноценный драйвер устройства, который будет заг-
ружаться при старте с помощью файла CONFIG.SYS. MS DOS поддержи-
вает такой тип драйверов устройств и однажды загруженный он может
использовать все возможности команд DOS, включая проверку ошибок.
Специальная команда IOCTL (Контроль ввода/вывода) позволяет прог-
рамме узнать статус драйвера и послать ему управляющую строку,
помимо обычного потока данных.
Первые три стратегии легко реализуются с помощью информации,
приведенной в остальных частях данной книги. Но устанавливаемые
драйверы устройств очень сложны. Зато когда он есть, то он очень
мощен. В этом случае система будет работать с устройством нас-
только же тесно, как с клавиатурой или дисковым накопителем.
Устройству может быть присвоено имя, например, SERIALPR для пос-
ледовательного принтера, и затем это устройство может быть откры-
то для доступа из любого языка. В Бейсике оператор OPEN "SE-
RIALPR" FOR OUTPUT AS #2 подготовит последовательный принтер для
вывода. В языке ассемблера Вы сможете получить доступ к принтеру
как с помощью метода управляющего блока файла, так и с помощью
метода дескриптора файла, включая очень мощную функцию IOCTL. При
этом пользователь имеет возможность доступа к устройству на уров-
не операционной системы и может просто ввести команду COPY A:MY-
FILE SERIALPR:, чтобы скопировать содержимое файла на принтер.
Устанавливаемые драйверы устройств могут быть написаны только
на языке ассемблера. Они могут обслуживать два типа устройств:
символьные и блочные. Эти имена описывают единицы, которыми уст-
ройство обрабатывает данные. Обычно драйверы блочных устройств
обслуживают дисковые накопители, а драйверы символьных - все
остальное, начиная от последовательных принтеров и кончая робота-
ми. Блочные устройства обмениваются блоками данных, поэтому они
занимаются накоплением данных. Символьные устройства обмениваются
данными побайтно, поэтому они лучше подходят для управляющих
устройств, а также для устройств, которые не могут обеспечить
высокую скорость обмена данными. Драйверы блочных устройств очень
сложны и здесь нет достаточно места, чтобы объяснить их структу-
ру. Очень редко кому требуется написать такой драйвер. Техничес-
кое руководство по MS DOS предоставляет всю необходимую информа-
цию и содержит полный пример драйвера виртуального диска в опера-
тивной памяти. Вы можете просмотреть эту информацию после того
как изучите обсуждение драйверов символьных устройств, приведен-
ное здесь.
Устанавливаемые драйверы устройств беспощадны к программистс-
ким ошибкам. Поскольку драйверы автоматически загружаются систе-
мой при загрузке, то невозможно использовать отладчики для выяв-
ления причин неполадок. Поэтому будьте предельно внимательны при
их написании.
Программа драйвера устройства разбивается на три части, каждая
из которых обсуждается отдельно в следующих разделах. Это (1)
заголовок драйвера, который именует устройство и содержит инфор-
мацию об остальных частях драйвера, (2) стратегия драйвера, кото-
рая хранит информацию об области данных, создаваемой MS DOS,
которая называетя заголовком запроса, и (3) обработчик прерывания
устройства, который и содержит код, управляющий устройством.