Когда программа обращается к 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 не сможет использовать свои стандартные средства ввода/вывода, ориентированные на связь с аппаратурой через драйверы. Поэтому наилучшим способом организации обслуживания аппаратуры является использование драйвера.