Драйвер устройства - это набор подпрограмм, используемых
операционной системой DOS для управления на нижнем уровне функциями ввода-вывода. Устанавливаемые драйверы устройств (в отличие
от драйверов, встроенных в DOS) устанавливаются с помощью включения соответствующих строк, например:
device = clock.sys
в файл CONFIG.SYS. Когда DOS выполняет операцию ввода-вывода для
отдельного символа, она просматривает связанный список заголовков
устройств, выполняя поиск устройства с соответствующим логическим
именем (например, COM1). В случае драйверов блочно-ориентированных
устройств, таких, как драйвер диска, DOS отслеживает, сколько установлено драйверов блочно-ориентированных устройств, и обозначает каждый из них буквой: A - первый установленный драйвер устройства, B - второй и т.д. Когда вы, например, ссылаетесь на
дисковод C, DOS знает, что нужно вызвать драйвер третьего блочно-ориентированного устройства.
Связанный список двух заголовков драйвера содержит смещение
двух компонентов самого драйвера устройства: подпрограмму функции
и подпрограмму обработки прерывания.
Когда DOS определяет, что требуется вызвать данный драйвер
устройства, она вызывает драйвер дважды. При первом вызове драйвера DOS общается с подрограммой функции и передает ей указатель
на буфер в памяти, который называется заголовком запроса. Этот
заголовок запроса содержит информацию о том, какие функции требует выполнить DOS от драйвера устройства. Подпрограмма функции
просто сохраняет данный указатель для последующего использования. При втором вызове драйвера устройства DOS вызывает подпрограмму обработки прерывания, которая выполняет реальные функции, заданные DOS в заголовке запроса, например, пересылку
символов с диска.
В заголовке запроса с помощью байта, который называется кодом команды, определяется, что должен делать драйвер устройства.
Код команды определяет одну из предопределенных операций из набора операций, которые должны выполнять все драйверы устройств. Набор кодов команд (операций) для драйверов символьно-ориентированных и блочно-ориентированных устройств различен.
Проблема при отладке драйверов устройств состоит в том, что
файл .EXE отсутствует, так как для выполнения соответствующих
функций драйвер должен быть загружен во время загрузки системы с
помощью команды DEVICE = DRIVER.EXT, где EXT - это расширение
.SYS, .COM или .BIN. Это означает, что отлаживаемый драйвер устройства уже резидентен в памяти до начала отладки. Следовательно,
функции по выполнению загрузки и перемещения таблицы идентификаторов весьма полезны, поскольку они могут восстановить информацию
об идентификаторах для дизассемблированного сегмента памяти (когда драйвер загружен). Как мы увидим далее, команда File Resident
также очень полезна.