Глава 7. Ввод/вывод.

Раздел 2. Создание драйвера устройства.

Драйвер устройства это специальная программа, которая управляет обменом с периферийным устройством, таким как принтер или дисковый накопитель. Поскольку параметры этих периферийных устройств меняются от производителя к производителю, то разным пользователям программы может потребоваться дюжина различных драйверов, чтобы он мог работать на имеющемся у него оборудовании. Имеется 4 способа включения драйверов устройств в программу:

1. Можно поместить код для всех драйверов прямо в программу. Hапример, чтобы поддерживать различные принтеры, можно создать таблицу управляющих последовательностей и искать в ней нужный код каждый раз когда он потребуется. Этот подход тратит много памяти и может быть достаточно медленным.

2. Создать ряд драйверов устройств и потребовать, чтобы программа загружала необходимый в качестве оверлея (т.е. помещать его в область программы, специально оставленную для этой цели {1.3.5}).

3. Создать драйвер устройства как отдельную программу, которая указывается в командном файле, выполняемом при загрузке системы. Программа запускается и устанавливает драйвер устройства как программу обработки прерывания. После этого программа завершается, но остается резидентной в памяти, как объяснено в {1.3.4}. Впоследствии наша программа использует этот драйвер через вектор прерывания.

4. Создать полноценный драйвер устройства, который будет загружаться при старте с помощью файла CONFIG.SYS. MS DOS поддерживает такой тип драйверов устройств и однажды загруженный он может использовать все возможности команд DOS, включая проверку ошибок. Специальная команда IOCTL (Kонтроль ввода/вывода) позволяет программе узнать статус драйвера и послать ему управляющую строку, помимо обычного потока данных.

Первые три стратегии легко реализуются с помощью информации, приведенной в остальных частях данной книги. Hо устанавливаемые драйверы устройств очень сложны. Зато когда он есть, то он очень мощен. В этом случае система будет работать с устройством настолько же тесно, как с клавиатурой или дисковым накопителем. Устройству может быть присвоено имя, например, SERIALPR для последовательного принтера, и затем это устройство может быть открыто для доступа из любого языка. В Бейсике оператор OPEN "SERIALPR" FOR OUTPUT AS #2 подготовит последовательный принтер для вывода. В языке ассемблера Вы сможете получить доступ к принтеру как с помощью метода управляющего блока файла, так и с помощью метода дескриптора файла, включая очень мощную функцию IOCTL. При этом пользователь имеет возможность доступа к устройству на уровне операционной системы и может просто ввести команду COPY A:MYFILE SERIALPR:, чтобы скопировать содержимое файла на принтер.

Устанавливаемые драйверы устройств могут быть написаны только на языке ассемблера. Они могут обслуживать два типа устройств: символьные и блочные. Эти имена описывают единицы, которыми устройство обрабатывает данные. Обычно драйверы блочных устройств обслуживают дисковые накопители, а драйверы символьных - все остальное, начиная от последовательных принтеров и кончая роботами. Блочные устройства обмениваются блоками данных, поэтому они занимаются накоплением данных. Символьные устройства обмениваются данными побайтно, поэтому они лучше подходят для управляющих устройств, а также для устройств, которые не могут обеспечить высокую скорость обмена данными. Драйверы блочных устройств очень сложны и здесь нет достаточно места, чтобы объяснить их структуру. Очень редко кому требуется написать такой драйвер. Техническое руководство по MS DOS предоставляет всю необходимую информацию и содержит полный пример драйвера виртуального диска в оперативной памяти. Вы можете просмотреть эту информацию после того как изучите обсуждение драйверов символьных устройств, приведенное здесь.

Устанавливаемые драйверы устройств беспощадны к программистским ошибкам. Поскольку драйверы автоматически загружаются системой при загрузке, то невозможно использовать отладчики для выявления причин неполадок. Поэтому будьте предельно внимательны при их написании.

Программа драйвера устройства разбивается на три части, каждая из которых обсуждается отдельно в следующих разделах. Это (1) заголовок драйвера, который именует устройство и содержит информацию об остальных частях драйвера, (2) стратегия драйвера, которая хранит информацию об области данных, создаваемой MS DOS, которая называетя заголовком запроса, и (3) обработчик прерывания устройства, который и содержит код, управляющий устройством.


<~-7.1.9 Сводка управляющих кодов, используемых при коммуникации.
Содержание
7.2.1 Создание заголовка драйвера.-~>

Сайт управляется системой uCoz