Обнаружение и анализ ошибок устройства

Доступ к драйверу устройства.

Драйвер устройства устанавливается путем включения имени готовой программы в файл конфигурации системы. После того как драйвер установлен, для доступа к нему используются обычные функции MS DOS прерывания 21H. Какие функции можно использовать зависит от того, заменяет ли устройство стандартное устройство DOS или оно добавляется как совершенно новое.

Для замены стандартного устройства, неодходимо назвать драйвер любым стандартным именем. Если устройство не заменяет одно из стандартных устройств MS DOS, то можно открыть устройство с помощью одной из функций для открытия файла. Чтобы быть уверенным, что по ошибке не будет открыт дисковый файл, необходимо поместить номер файла в BX, 0 - в AL, посде чего выполнить функцию 44h прерывания 21h.

Это функция IOCTL и если бит 7 значения, возвращаемого в DL установлен, то драйвер устройства загружен. IOCTL требует, чтобы в байте атрибутов драйвера была соответствующая установка битов и чтобы по крайней мере основные процедуры обработки IOCTL имелись в процедуре обработчика прерывания драйвера. Функция IOCTL имеет 8 подфункций, пронумерованных от 0 до 7, при этом соответствующий кодовый номер помещается в AL при вызове функции:

0. Возвратить информацию об устройстве в DX.

1. Установить информацию об устройстве, используя DL (DH=0).

2. Считать CX байтов от драйвера устройства и поместить их начиная с DS:DX.

3. Записать CX байтов в драйвер устройства, взяв их начиная с DS:DX.

4. То же, что и 2, но использовать номер накопителя в BL.

5. То же, что и 3, но использовать номер накопителя как в 5.

6. Получить статус ввода.

7. Получить статус вывода.

В ответ возвращается различная информация, в зависимости от того, какая функция вызвана.

Устройства могут ошибаться по одной из трех причин:

1. Устройство может быть физически повреждено или находиться не в том состоянии.

2. Может быть плохим программное обеспечение, управляющее устройством.

3. Программа может послать устройству недопустимый запрос (например, попытка писать на накопитель, где находится дискета, защищенная от записи).

MS DOS обнаруживает и анализирует большинство таких ошибок и обеспечивает возможности для восстановления. Иногда драйверы устройств содержат такие серьезные ошибки, что программа просто не может продолжаться, пока они не будут исправлены. Когда такие ошибки происходят, то система вызывает обработчик критических ошибок. Он может вступать в действие как для стандартных устройств, так и для установленных драйверов. Обработчик критических ошибок может быть переписан, чтобы он лучше обрабатывал устройства, для которых Вы создали устанавливаемые драйверы.

Вектор прерывания 24h указывает на стандартную процедуру MS DOS, но можно перенаправить вектор на свою процедуру. При вызове этой процедуры старший бит AH содержит 0 если ошибка произошла на блочном устройстве и 1, если на символьном. BP:SI указывают на заголовок драйвера виновного устройства, который может дать дополнительную информацию (имя). Обработчик критичеких ошибок помещает код ошибки длиной в слово в DI. Вот кодовые номера некоторых ошибок (в случае дисковой ошибки AL содержит номер накопителя, на котором произошла ошибка):

Код/Проблема

0. попытка писать на диск, защищенный от записи

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

2. накопитель не готов

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

4. ошибка обмена данными

5. неверная длина запроса

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

7. неизвестный тип носителя

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

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

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

B. ошибка при чтении

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

Есть три способа, которыми программа может восстановиться после критической ошибки:

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

2. Управление может быть возвращено инструкции, следующей за INT 21H, которая сделала попытку обратиться к драйверу.

3. Программа может завершиться и вернуть управление системе.

Ваша процедура обработки ошибок может восстановить ситуацию, выдав инструкцию IRET, после того, как она поместила в AL:

0 – чтобы игнорировать ошибку,

1 – чтобы повторить операцию,

2 – чтобы завершить программу.

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


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



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