Когда программа обращается к DOS для выполнения какой-либо операции, она должна вызвать соответствующее прерывание, загрузив перед вызовом прерывания все необходимые операнды в регистры процессора. Если выполнение операции невозможно по каким-то причинам (неправильные операнды, устройство неработоспособно, запрашиваемая операция не поддерживается текущей версией DOS и т.д.), то для большинства функций DOS устанавливается признак ошибки - флаг переноса CARRY. Для DOS версии 2.0 и более поздних версий регистр AX при этом содержит код ошибки.
Приведем коды ошибок, возвращаемые программе через регистр AX:
| Неправильный код функции | |
| Файл не найден | |
| Путь не найден | |
| Слишком много открытых файлов | |
| Доступ запрещен | |
| Неправильный идентификатор файла | |
| Разрушен блок управления памятью | |
| Недостаточно памяти | |
| Неправильный адрес блока памяти | |
| Неправильная среда | |
| Неправильный формат | |
| Неправильный код доступа | |
| Неправильные данные | |
| Зарезервировано | |
| Ошибка при указании дисковода | |
| Невозможно удалить текущий каталог | |
| Другое устройство | |
| Больше нет подходящих файлов |
Для DOS версии 3.0 и более поздних версий обработка ошибок значительно расширена. Введена функция 59h прерывания INT 21h, предназначенная для получения дополнительной информации об ошибках.
|
|
|
При вызове этой функции регистр BX должен содержать индикатор уровня анализа ошибок, который должен быть равен 0. Кроме расширенного кода ошибки, возвращаемого в регистре AX, программа может получить класс ошибки (регистр BH), код предполагаемых действий (регистр BL), локализацию ошибки, т.е. место, где произошла ошибка (регистр CH).
К сожалению, эта функция разрушает содержимое регистров CL, DX, SI, DI, BP, DS, ES. Программа, использующая функцию 59h, должна позаботиться о сохранении содержимого этих регистров.
Расширенный код ошибки, возвращаемый в регистре AX, может принимать значения, указанные в приводимой ниже таблице. Коды от 1 до 18 эквивалентны представленным выше и второй раз не приводятся.
Расширенные коды ошибок:
| Запись на защищенный от записи диск | |
| Задан неизвестный идентификатор устройства | |
| Дисковод не готов | |
| Неизвестная команда | |
| Ошибка циклического кода проверки | |
| Неправильная длина структуры запроса | |
| Ошибка поиска | |
| Неизвестен тип среды носителя данных | |
| Сектор не найден | |
| Кончилась бумага в принтере | |
| Ошибка записи | |
| Ошибка чтения | |
| Общая ошибка | |
| Нарушение разделения файла | |
| Нарушение блокировки файла | |
| Неправильная замена диска | |
| FCB недоступен (слишком много блоков FCB) | |
| Переполнился буфер разделения | |
| Зарезервировано | |
| Не завершена операция "Конец файла" | |
| 39-49 | Зарезервировано |
| Сетевая функция не поддерживается | |
| Удаленный компьютер "не слышит" | |
| Дублирование имени в сети | |
| Сетевое имя не найдено | |
| Сеть занята | |
| Сетевое устройство больше не существует | |
| Превышен лимит команды сетевой BIOS | |
| Ошибка в аппаратуре сетевого адаптера | |
| Неправильный ответ из сети | |
| Непредусмотренная ошибка сети | |
| Несовместимый удаленный адаптер | |
| Заполнена очередь печати | |
| Для печатаемого файла недостаточно места | |
| Печатающийся файл был удален | |
| Сетевое имя было удалено | |
| Доступ запрещен | |
| Неправильный тип сетевого устройства | |
| Сетевое имя не найдено | |
| Превышен лимит сетевого имени | |
| Превышен лимит сеанса сетевой BIOS | |
| Временная пауза | |
| Сетевой запрос отвергнут | |
| Приостановлена печать или переадресация диска | |
| 73-79 | Зарезервировано |
| Файл уже существует | |
| Зарезервировано | |
| Невозможно создать дескриптор в каталоге | |
| Ошибка обработчика критических ошибок INT 24h | |
| Слишком много переназначений | |
| Двойное переназначение | |
| Неправильный пароль | |
| Неправильный параметр | |
| Ошибка данных в сети | |
| Нет такой функции в сети | |
| Требуемый компонент системы не установлен |
Класс ошибки, передаваемый в регистре BH, содержит информацию, которая поможет вам обработать данную ошибку:
|
|
|
| Недостаточно ресурсов: блоков FCB, памяти и т.д. | |
| Временная ситуация | |
| Нет прав доступа | |
| Внутренняя ошибка DOS | |
| Ошибка аппаратуры | |
| Системная ошибка DOS (нет CONFIG.SYS и т.п.) | |
| Ошибка в прикладной программе | |
| Файл или объект не найден | |
| Неправильный формат файла или объекта | |
| Файл или объект заблокирован | |
| Ошибка носителя данных | |
| Файл или объект уже существует | |
| Прочие ошибки |
Код предполагаемых действий, передаваемый через регистр BL, поможет Вашей программе правильно обработать ошибку и избежать зависания системы. Приведем таблицу кодов предполагаемых действий:
| Повторить операцию позже. Можно спросить пользователя, желает он повторить операцию или завершить работу программы. | |
| Повторить предыдущую операцию после небольшой паузы. Если ошибка не исчезла, следует спросить пользователя, будет он ждать и дальше, или следует завершить работу программы. | |
| Если пользователь вводил какие-то данные для DOS, следует попросить его ввести эти данные еще раз (например, пользователь мог указать неправильный идентификатор диска или путь доступа к файлу). | |
| Аварийно завершить работу прикладной программы с выполнением всех обычных завершающих действий (закрытие файлов, сброс буферов на диск, освобождение блоков памяти и т.д.) | |
| Немедленный выход из программы без выполнения завершающих действий. Система находится в непредсказуемом состоянии. | |
| Следует игнорировать ошибку. | |
| Повторить операцию после того, как пользователь выполнит требуемые действия (установит дискету и т.п.). |
Сведения о локализации ошибки передаются в регистре CH. Приведем таблицу кодов локализации:
| Локализация ошибки не может быть определена (система не знает, где произошла ошибка). | |
| Ошибка произошла в блочном устройстве (диск или магнитная лента). | |
| Ошибка связана с сетью. | |
| Ошибка произошла в символьном устройстве, например, в принтере. | |
| Ошибка связана с оперативной памятью. |
Если Ваша программа составлена на языке ассемблера, то после обращения к DOS через прерывание следует проверить состояние флага переноса:
|
|
|
Фирмы-разработчики аппаратного обеспечения постоянно совершенствуют внешние устройства и другие узлы персонального компьютера. Постоянно появляются новая периферийная аппаратура и новые модификации уже существующих устройств. Старые устройства наделяются новыми возможностями, новые делают такое, о чем раньше не приходилось и мечтать.
Этот процесс можно только приветствовать, однако что делать с уже разработанным программным обеспечением, рассчитанным на старую аппаратуру? Если разработка программного обеспечения была дорогостоящая, если по своим возможностям она еще не устарела, вряд ли целесообразно переделывать все заново только из-за того, что появился новый дисковод с большей емкостью носителя данных или новый принтер, обеспечивающий лучшее качество печати.
Интуитивно ясно, что должна существовать какая-то программная прослойка между аппаратным и программным обеспечением, выполняющая "согласующие" и "унифицирующие" действия. Эта прослойка работает напрямую с аппаратурой, а прикладное (да и системное) программное обеспечение имеет дело только с этой интерфейсной прослойкой.
В разных типах компьютеров и для разных типов операционных систем существуют различные способы устранения зависимости программного обеспечения от аппаратуры. По-видимому, одним из наиболее неудачных следует считать способ, примененный в операционной системе ОС ЕС для ЭВМ ряда ЕС. Для ЭВМ ряда ЕС любое периферийное устройство имеет одинаковый и достаточно сложный аппаратный интерфейс с каналами ЭВМ (канал - это устройство, обеспечивающее ввод/вывод информации в ЭВМ ряда ЕС). Для каждого типа устройства составляются канальные программы (программы, которые будут выполняться каналом). Прикладное программное обеспечение может пользоваться либо вводом/выводом на этом, крайне низком, канальном уровне, либо осуществлять ввод/вывод на уровне так называемых методов доступа. Библиотеки программ методов доступа содержат программы, работающие на канальном уровне. Для любого, даже очень простого нового устройства в этой системе необходим сложный аппаратный интерфейс с каналом. Составление программ своего метода доступа - крайне сложная задача, доступная лишь профессионалам высокого класса. О внесении изменений в существующие программы методов доступа говорить вообще вряд ли стоит, так как они очень сложны, а исходные тексты этих программ, как правило, отсутствуют.
|
|
|
Другой подход используется в операционных системах UNIX и аналогичных ей (XENIX, VENIX и т.д.).
В этих операционных системах для каждого устройства составляется своя программа обслуживания - драйвер. Эта программа выполняет все операции со своим устройством. Сама операционная система имеет дело только с драйвером, а прикладное программное обеспечение для выполнения ввода/вывода вызывает соответствующие модули операционной системы. Такая программная "буферизация" устраняет, с одной стороны, зависимость операционной системы от аппаратуры, с другой - зависимость прикладной программы от операционной системы и от аппаратуры.
Для каждого нового устройства (например, для нового видеоконтроллера) фирма-разработчик поставляет свой драйвер. Если Вы купили новое устройство, Вы просто подключаете новый драйвер к операционной системе и все Ваши любимые старые программы будут теперь работать с новым устройством.
Этот подход имеет тот недостаток, что Вы не сможете легко и свободно переносить Вашу операционную систему с одного типа компьютера на другой, даже совместимый с ним. Драйверы операционной системы UNIX очень сильно привязаны к аппаратуре. На компьютере, который совместим с исходным не полностью, эти драйверы работать не будут.
Обычно операционные системы поставляются с конкретным комплектом драйверов под определенный тип компьютера, и с этим приходится считаться.
Операционная система MS-DOS, работающая на компьютерах фирмы IBM или совместимых с ними, тоже использует механизм драйверов.
Однако драйверы MS-DOS не всегда обращаются напрямую к аппаратуре. Обычно они вызывают функции BIOS, и уже BIOS выполняет все действия по вводу/выводу. Конечно, BIOS содержит программы обслуживания только стандартных устройств ввода/вывода, нестандартные устройства обслуживаются драйверами напрямую.
Использование BIOS как дополнительного интерфейса между драйверами стандартных устройств и аппаратурой резко повышает "живучесть" MS-DOS на не вполне совместимых с IBM персональных компьютерах. И это действительно так - самая распространенная на сегодняшний день операционная система MS-DOS версии 3.30 работает на всех компьютерах, хоть сколько-нибудь совместимых с IBM PC.
Это возможно благодаря тому, что производители совместимых компьютеров учитывают в программах BIOS все аппаратные особенности, и DOS "не видит" отличий. А прикладная программа - тем более.
Почему же этот способ не используется в операционных системах UNIX или OS/2? Дело в том, что к сожалению, программы BIOS не являются реентерабельными. Это не имеет значения для однозадачной MS-DOS, а мультизадачные операционные системы вынуждены сами организовывать обслуживание аппаратуры реентерабельным способом. (Существуют еще проблемы разделения ресурсов между параллельно выполняющимися процессами, которые тоже не решаются в рамках BIOS).
Таким образом, независимость аппаратного и программного обеспечения в DOS обеспечивается, с одной стороны, BIOS для стандартных устройств, с другой стороны - драйверами.
Пользователи могут легко дополнять операционную систему своими драйверами, составленными для нестандартных устройств. Возможна также замена стандартных драйверов, замена или расширение функций BIOS.
В разделе, посвященном резидентным программам, мы уже рассказывали о том, как можно организовать обслуживание нестандартных устройств в DOS с помощью TSR-программ. Но это "незаконный" способ с точки зрения DOS, так как при этом DOS не сможет использовать свои стандартные средства ввода/вывода, ориентированные на связь с аппаратурой через драйверы. Поэтому наилучшим способом организации обслуживания аппаратуры является использование драйвера.






