Страница 16 из 27
Раздел 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) обработчик прерывания устройства, который и содержит код, управляющий устройством.
|