Создание обработчика прерывания устройства

Создание стратегии устройства.

Программа стратегий вызывается, когда драйвер устанавливается при загрузке операционной системы, а также при каждом сгенерированном операционной системой запросе на ввод/вывод. Процедура стратегии устройства содержиттолько пять строк, предназначенных для определения местоположения области запроса. Область запроса (заголовок запроса) создается при загрузке драйвера. Она имеет две функции:

– Служит областью данных для внутренних операций системы.

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

Размер заголовка запроса может меняться, в зависимости от типа сделанного запроса к драйверу (напр. инициализация, вывод данных или возврат статуса). Однако первые 13 байт заголовка всегда одни и те же. Их формат таков:

– Длина заголовка запроса (DB).

– Код устройства (DB). Определяет номер для блочных устройств.

– Код команды (DB). Здесь хранится номер последней посланной драйверу команды.

– Статус (DW). Статус устанавливается каждый раз при вызове драйвера. Если установлен бит 15, то в младших восьми битах находится код ошибки.

– Резервная область (8 байтов). Используется MS DOS.

– Дополнительные строки - данные необходимые для работы драйвера (переменной длины).

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

Имеется несколько типов функций, которые должен выполнять драйвер устройства. Когда драйвер вызывается функцией DOS то код функции драйвера (не функции DOS!) помещается в однобайтное поле по смещению 2 в заголовке запроса. Затем управление передается процедуре обработки прерывания драйвера, адрес которой определяется при просмотре заголовка драйвера. Эта процедура в первую очередь должна восстановить ES:BX, с тем чтобы они указывали на заголовок запроса, а затем прочитать кодовый номер команды.

По этому коду процедура обработки прерывания вызывает нужную процедуру, которая выполнит требуемую функцию. Процедура обычно ищется с помощью 13-словной таблицы, содержащей смещения для 13 типов функций.

Функции всегда перечисляются в следующем порядке:

0. INITIALIZE (инициализация)

1. CHECK_MEDIA (проверка среды, возвращает информацию о текущем состоянии системы)

2. MAKE_BPB (построить блок параметров BPB - вызывается при создании или изменениии среды)

3. IOCTL_IN (чтение информации о состоянии драйвера и значении его параметров)

4. INPUT_DATA (ввод данных)

5. NONDESTRUCT_IN (чтение без удаления - читается очередной символ, не удаляя его из входного буфера)

6. INPUT_STATUS (статус ввода - проверка на наличие символов в буфере)

7. CLEAR_INPUT (очистка ввода - очищается входной буфер)

8. OUTPUT_DATA (вывод данных)

9. OUTPUT_VERIFY (проверка вывода - вывести символы с последующим чтением)

A. OUTPUT_STATUS (статус вывода - проверка наличия символов в буфере)

B. CLEAR_OUTPUT (очистка вывода - очищает выхоной буфер)

C. IOCTL_OUT (изменеие текущего состояния драйвера и его параметров)

D. Открыть устройство (только для DOS 3.x). Инициализировать устройство.

E. Закрыть устройство (только для DOS 3.x). Вызывается перед закрытием файлов.

F. Программа обработки перемещаемой среды (только для DOS 3.x). Только для блоковых устройств.

10. Вывод до сигнала занятости (только для DOS 3.x).

Ненормальный вариант обычной функции вывода, допускающий «неполный» вывод. После завершения процедуры, процедура обработки прерывания завершается инструкцией RET и управление возвращается в вызывающую программу. Драйвер устройства может включать код для обработки только некоторых функций, в зависимости от устройства и требуемой степени контроля ошибок и управления устройством. Номера функций, для которых не написаны процедуры, должны завершаться выходом из драйвера без выполнения чего-либо. В этом случае надо только перед выходом установить биты 15, 8, 1 и 0 в заголовке запроса (область статуса), чтобы информировать вызывающую задачу, что была затребована несуществующая функция. Формат слова статуса:

15 =1 была ошибка;

14..10 резерв;

9 =1 драйвер занят;

8 =1 операция выполнена;

7..0 код ошибки, если бит 15=1:

0 попытка записи на защищенное от записи устройство

1 неизвестное устройство

2 устройство не готово

3 неизвестная команда

4 ошибка проверки по контрольной сумме

5 неверная длина запроса к устройству

6 ошибка поиска

7 неизвестный носитель

8 сектор не найден

9 нет бумаги в принтере

A ошибка записи

B ошибка чтения

C общая ошибка

E зарезерверовано

F изменение среды недопустимо

Одна функция должна присутствовать во всех драйверах устройств, и это функция номер 0 - инициализация. Она автоматически выполняется при загрузке драйвера (один раз). Одна из важных задач, выполняемая этой процедурой, состоит установке адреса конца драйвера в четырех байтах, начинающихся со смещения Eh в заголовке запроса. Кроме этой задачи, процедура инициализации должна также выполнить всю необходимую для данного устройства инициализацию. При входе в блоке заголовка со смещения Eh находится адрес символа "=" выполняемой строки CONFIG.SYS, что позволяет получить строку параметров драйвера.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: