бит слова атрибутов SPECL, значит драйвер будет работать в режиме
высокоскоростного вывода. Этот режим и бит атрибутов SPECL обсуж-
даются более глубоко в разделе "Слове атрибутов заголовка драйве-
ра".
Группа команд управления вводом/выводом
Четыре IOCTL команды, появившиеся в MS-DOS версии 3.3 - коман-
ды C, D, E и F - являются необязательными и разрешены только при
установленном бите 6 слова атрибутов драйвера. Группа подфункций,
обеспечиваемых командами C и D, представляет собой довольно "раз-
ношерстное" собрание весьма специфических функций. Эта группа,
как правило, используется для поддержки определенных, заданных
изготовителем устройства функциональных особенностей, таких как
переключение фонтов в принтере, форматирование диска и т.д. Если
Вам кажется, что у Вас есть необходимость использовать эти коман-
ды, следует обратиться к руководству программиста, где представ-
лена более подробная информация.
Команды E и F позволяют прикладному программисту управлять
назначением и освобождением логических дисков, например так, как
это делается командой SUBST. Команда E ("Получить имя логического
диска") возвращает назначение, использованное при последнем обра-
щении к реальному устройству, а команда F ("Установить имя логи-
ческого диска") используется для изменения назначенных имен логи-
ческих дисков.
Прямой доступ к диску через прерывания INT 25H и INT 25H
С другой стороны спектра от доступа к устройству с помощью
описателей файлов (ДОМД) лежат прерывания прямого доступа к диску
: "Чтение по абсолютному адресу" (INT 25H) и "Запись по абсолют-
ному адресу" (INT 26H). Согласно названию, прерывания прямого
доступа к диску работают исключительно с блоковыми устройствами,
например с дисками. Задача этих прерываний заключается в обеспе-
чении работы с дисками напрямую, не используя файловую структуру
MS-DOS. Это может быть полезно в двух случаях.
В первом случае, программисты могут считывать или записывать
отдельные части стандартного диска MS-DOS, содержащие файл или
структуру директория. Это часто требуется, когда часть диска ста-
новится плохой и невозможно, поэтому, использовать FCB-метод или
ДОМД. В этом случае можно использовать функции прямого доступа к
диску для того, чтобы попробовать восстановить все, что может
быть восстановлено. Кроме того, программы могут считывать и запи-
сывать таблицу распределения (FAT) или директории диска, недос-
тупные другим методам. Такая способность требуется утилитам,
- 6-16 -
сортирующим директории, изменяющим атрибуты файлов и т.п.
Во втором случае, использование этих функций может потребо-
ваться в случае, если диск вообще не содержит таблицы распределе-
ния файлов или директориев. Такой диск может быть использован
только как диск данных. Такая же ситуация может встретиться при
чтении дисков, записанных в другой операционной среде, такой как
CP/M или UCSD-p система. Во всех этих случаях параметры диска,
возвращаемые системе драйвером, делают невозможным доступ к диску
любым другим методом. Любая попытка выполнения файловых операций
ввода/вывода, включая чтение директория, возвратит мусор или со-
общение об ошибке ("Non-DOS Disk"). Если Вы желаете получить под-
робную информацию о том, как MS-DOS определяет формат диска,
просмотрите описание команды драйверу "Построить блок параметров
BIOS" в руководстве программиста или ином, аналогичном документе.
Возвращаясь к обеспечению прямого доступа к диску, следует за-
метить, что INT 25H и INT26H не выполняют блокирование и деблоки-
рование данных. Блокирование и деблокирование требуются, когда
размер физического сектора на диске отличается от размера логи-
ческой записи, используемого системой. При блокировании данных
система собирает вместе достаточное количество записей для запол-
нения физического сектора перед сохранением его на диске. Дебло-
кирование используется при чтении с диска, т.к. один физический
сектор может содержать несколько записей. В последнем случае сис-
тема считывает целый сектор и, затем, выбирает оттуда требуемые
программе записи. Функции доступа к диску по абсолютным адресам
считывают и записывают только целые секторы, так что программист
обязан знать размер сектора диска для того, чтобы определить ко-
личество считанных или записанных байтов.
В связи с тем, что параметры, используемые этими прерываниями,
передаются драйверу без какого-либо преобразования, операции чте-
ния и записи передают блоки данных размером, кратным длине секто-
ра диска. Это отличает данный метод доступа от FCB-метода или
описатель-ориентированного метода доступа, где ввод/вывод опре-
деляется в терминах логических блоков и записей, а MS-DOS осу-
ществляет преобразование логических блоков в физические секторы.
Последняя особенность функций прямого доступа к диску заключа-
ется в том, что они возвращаются из прерываний INT 25H и INT 26H
при помощи команды RETF, а не IRET, оставляя при этом флаги на
стеке. Поэтому, после проверки корректности выполнения функции,
Вы должны убрать флаги со стека.
Опция "Ввод/вывод с проверкой"
При выполнении операций ввода/вывода следует учитывать одну
особенность, влияющее на работу драйвера устройства. Эта особен-
ность вызывается использованием опции "Ввод/вывод с проверкой",
при помощи которой можно заставить драйвер проверять выполнение
команд вывода, т.е. осуществлять считывание после записи. Эта оп-
ция может устанавливаться или отменяться тремя способами :
1.С командной строки MS-DOS пользователь может выполнить
команды "VERIFY ON" или "VERIFY OFF" для того, чтобы соот-
ветственно включить или выключить эту опцию.
2.Для некоторых команд MS-DOS, таких как COPY, можно за-
дать ключ /V, который включает опцию проверки на время вы-
полнения команды.
- 6-17 -
3.Опция проверки может быть включена и выключена любой
программой, используя функцию MS-DOS 2H ("Включить или
выключить опцию проверки").
Выводы
В этом разделе мы обсудили основные типы операций, которые мо-
гут потребоваться от драйвера; мы вплотную подошли к вопросам,
связанным с разработкой драйверов.
Обобщая все вышесказанное, можно отметить следующее. Выполне-
ние основных операций ввода/вывода всегда производится через
драйверы устройств. Драйверы могут также поддерживать дополни-
тельный канал ввода/вывода для управления устройством. Символьные
драйверы могут передавать от 1 до 64 Kбайт за одно обращение к
драйверу. Блоковые драйверы могут передавать данные только по
секторам, т.к. преобразование секторов в записи и обратно выпол-
няет MS-DOS. Как мы вкратце упоминали, блоковые драйверы могут
возвращать информацию об используемом ими в настоящий момент дис-
ке.
Создание драйверов устройств
Создание драйверов в любой операционной системе имеет много
преимуществ перед написанием обычных программ. Драйверы устройств
должны следовать строго определенной структуре, а если структура
понятна, то остальное приложится.
Базовая структура драйвера устройства показана на рис.6-3.
Обязательно должны присутствовать три раздела драйвера -- ЗАГОЛО-
ВОК ДРАЙВЕРА, ПРОГРАММА СТРАТЕГИЙ и ПРОГРАММА ПРЕРЫВАНИЙ. Прог-
рамма ПРЕРЫВАНИЙ это не тоже самое, что программа обработки пре-
рываний, которая может присутствовать в качестве необязательной
части работающего по прерываниям драйвера. На самом деле, прог-
рамма ПРЕРЫВАНИЙ - это точка входа в драйвер для обработки полу-
чаемых от MS-DOS команд.
ЪДДДДДДДДДДДДДДДДДДДДДДДДД·
¦ Заголовок драйвера є
ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
¦ Область данных драйвера є
ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
¦ Программа СТРАТЕГИЙ є
ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
¦ Вход в є
¦ программу ПРЕРЫВАНИЙ є
ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
¦ Обработчик команд є
ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
¦ Программа обработки є
¦ прерываний є
ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
¦ Процедура инициализации є
ФНННННННННННННННННННННННННј
Рисунок 6-3. Структура драйвера в MS-DOS
- 6-18 -
В программе 6-1 представлен скелет драйвера устройства. Хотя
структура драйвера похожа на структуру .COM программы, важно от-
метить следующие отличия :
1. Программа начинается с нулевого смещения, а не 100H.
2. Образ программы начинается с директив определения данных
для заголовка драйвера.
3. Программа не содержит директивы ASSUME для стекового
сегмента.
4. Программа не содержит директивы END START.
Листинг 6-1. Заголовок драйвера, программы СТРАТЕГИЙ и ПРЕРЫВАНИЙ
------------------------------------------------------------------
DRIVER SEGMENT PARA
ASSUME CS:DRIVER,DS:NOTHING,ES:NOTHING
ORG 0
START EQU $ ; Начало драйвера
;
;******* ЗАГОЛОВОК ДРАЙВЕРА *******************************************
;
dw -1,-1 ; Указатель на следующий драйвер
dw ATTRIBUTE ; Слово атрибутов
dw offset STRATEGY ; Точка входа в программу STRATEGY
dw offset INTERRUPT ; Точка входа в программу INTERRUPT
db 8 dup (?) ; Количество устройств/поле имени
;
;******* РЕЗИДЕНТНАЯ ЧАСТЬ ДРАЙВЕРА ***********************************
;
req_ptr dd ? ; Указатель на заголовок запроса
.
.
.
;
;******* ПРОГРАММА СТРАТЕГИИ ******************************************
;
; Сохранить адрес заголовка запроса для программы СТРАТЕГИЙ в REQ_PTR.
; На входе адрес заголовка запроса находится в регистрах ES:BX.
;
STRATEGY PROC far
mov cs:word ptr [req_ptr],bx
mov cs:word ptr [req_ptr + 2],bx