выдавая простые команды типа "Отобразить символ" и "Получить сим-
вол". Все технические детали по пересылке символов берет на себя
драйвер, обеспечивая тем самым желанный для прикладной программы
высокоуровневый интерфейс. Замена терминала может вызвать замену
драйвера, но при этом в прикладной программе не потребуется де-
лать никаких изменений. Драйверы дисководов должны обеспечивать
стандартный интерфейс для всех используемых типов дисков, при
этом программа, осуществляющая ввод/вывод с диска, будет работать
с дискетой любого формата, с жестким диском, и даже с псевдодис-
ком в ОЗУ, не замечая никаких различий. Одним словом, первая за-
дача драйвера состоит в обеспечении независимого от устройства
унифицированного интерфейса.
Второе целевое назначение драйверов устройств заключается в
том, что они для всех прикладных программ обеспечивают сервис,
подобный библиотекам функций времени выполнения. Любая программа
освобождена не только от необходимости поддержки множества разно-
форматных устройств, но и от необходимости поддерживать вообще
какие-либо форматы. Все заботы по поддержке устройств возложены
на драйверы устройств. В связи с тем, что все драйверы собраны в
операционной системе, требуется лишь одна копия каждого драйвера.
В результате этого программы, написанные с использованием интер-
фейса, предоставляемого MS-DOS, вообще не содержат в себе драйве-
ров.
В операционной системе MS-DOS версии 2.0 и выше драйверы могут
быть добавлены для того, чтобы заменить встроенные драйверы сис-
темы. Если Вам не нравится как работает системный драйвер с конк-
ретным устройством, Вы можете написать свой собственный драйвер.
Как подчеркивалось выше, прикладные программы при этом ничего не
заметят. Конечно создание драйвера - не самое простое занятие,
но, по крайней мере, такая возможность у Вас есть.
Имея такое мощное средство обеспечения работы MS-DOS с различ-
ными устройствами, недолго представить себе драйверы, не поддер-
живающие реальных устройств! Другими словами, можно написать
драйвер,который поддерживает несуществующее устройство, например
драйвер-эмулятор диска в ОЗУ. Такие устройства получили название
"виртуальные устройства", а драйверы таких устройств, соответс-
твенно, "драйверы виртуальных устройств" или просто "виртуальные
- 6-3 -
драйверы".
Реальные или виртуальные устройства не ограничены, по сути де-
ла, только операциями ввода/вывода. На драйвер может быть возло-
жена любая функция по преобразованию данных. Высокоскоростные
процессоры для выполнения больших объемов вычислений с плавающей
точкой - это только один из примеров устройства преобразования
информации. Кроме того, драйверы могут программно эмулировать ре-
альные устройства, которые отсутствуют в конкретной системе, та-
кие как часы или сопроцессор с плавающей точкой.
Когда использовать драйверы устройств?
При каких условиях некоторую функцию следует удалить из прог-
раммы и перенести в драйвер? Основное правило состоит в том, что
если какая-либо функция выполняет ввод/вывод на на физическом
уровне (т.е. работая непосредственно с аппаратурой), то эта функ-
ция - прекрасный кандидат для переноса в драйвер. По самой приро-
де семейства микропроцессоров 80x86 такие функции обычно содержат
команды IN и/или OUT (включая INS или OUTS). Если система поддер-
живает ввод/вывод, отображенный на память, доступ к абсолютным
адресам памяти также может служить индикатором ввода/вывода на
физическом уровне (чтение и запись векторов прерываний тоже явля-
ется доступом к абсолютным адресам, но, конечно, предпочтительнее
использовать функции MS-DOS "Получить вектор прерывания" и "Уста-
новить вектор прерывания", чем использовать для этих же целей
драйвер).
Выделение программ-обработчиков операций ввода/вывода в драй-
вер устройства порождает четыре следствия : это делает программы
более переместимыми, делает обработчики операций ввода/вывода
доступными для других программ, желающих работать с этим устройс-
твом, несколько увеличивает в размерах систему и замедляет время
доступа к аппаратуре. Некоторое увеличение размера памяти, зани-
маемой системой, не имеет большого значения, а вот увеличение
времени доступа может быть критическим фактором для некоторых
приложений. Когда принимается решение о написании драйвера, необ-
ходимо тщательно взвесить скоростные характеристики программы, с
одной стороны, и повышение совместимости программ и доступность
драйвера, с другой стороны. Увеличение времени доступа за счет
накладных расходов при каждом обращении к драйверу более заметно
для устройств, которые передают за один раз слово или байт дан-
ных. В драйверах, передающих за одно обращение целый блок данных,
накладные расходы заметно уменьшаются.
MS-DOS - нереентерабельная система
В связи с тем, что обращения к драйверам осуществляет MS-DOS,
на них накладываются такие же ограничения, как и на резидентные в
памяти программы. Так, например, драйверы не могут пользоваться
функциями MS-DOS (за исключением некоторых функций, которые могут
использоваться при инициализации драйвера). Это серьезно ограни-
чивает свободу драйверов виртуальных устройств, созданных для до-
полнительной обработки информации, предназначенной для стандарт-
ных драйверов.
Так, например, драйвер виртуального принтера, предназначенный
для поддержки графических примитивов на игольчатом принтере не
может использовать стандартные функции MS-DOS для вывода симво-
лов. Драйвер виртуального принтера должен обеспечивать полную
- 6-4 -
программную поддержку для осуществления физического вывода на
принтер. Заметим, что драйвер, описанный в этом примере, именует-
ся виртуальным, несмотря на то, что он работает с физическим уст-
ройством. Это объясняется тем, что драйвер предоставляет возмож-
ности, не поддерживаемые реальным устройством, такие как
выполнение графических операций на простом принтере.
В связи с тем, что MS-DOS нереентерабельна, нельзя использо-
вать программу DEBUG для отладки установленного драйвера. Для вы-
полнения собственных операций ввода/вывода DEBUG использует
MS-DOS и если DEBUG использовать для отладки драйвера, он испор-
тит переданную драйверу информацию, делая невозможным возврат
корректной информации в MS-DOS. Один из способов обхода этого
препятствия заключается в использовании любых имеющихся встроен-
ных функций ввода/вывода (например, функций BIOS) для вывода от-
ладочной информации. Более предпочтительный способ заключается в
создании небольшой тестовой программы для проверки работы драйве-
ра, которая передает драйверу тестовые данные и проверяет возвра-
щаемую информацию. Такая программа запускается под управлением
отладчика обычным образом. Конечно, если устройство критично ко
времени, необходимо принять соответствующие меры, чтобы избежать
какого-либо влияния на работу драйвера.
Установка драйверов устройств
Как упоминалось ранее, во времена, предшествующие MS-DOS вер-
сии 2.0, установка драйвера устройства означала изменение BIOS.
Начиная с версии 2.0 появилась возможность устанавливать и заме-
нять драйверы в процессе начальной загрузки системы.
Процесс начальной загрузки MS-DOS начинается со сброса систе-
мы. Аппаратура Вашей системы устанавливается в состояние сброса
при включении питания компьютера. Сразу после сброса процессор
начинает выполнять команды, находящиеся в самом конце его адрес-
ного пространства. Для процессора 80386 это команды, находящиеся
по шестнадцатиричному адресу FFFFFFF0, для процессора 80286 по
адресу FFFFF0, для процессора 8086 по адресу FFFF0. В любом слу-
чае по этим адресам находится ПЗУ, содержащее начальный загруз-
чик, задача которого заключается в загрузке системной области
диска в память. Интересно отметить, что возможности начального
загрузчика постоянно росли. Первый персональный компьютер фирмы
IBM (IBM PC) мог загружаться только с дисковода "A". Вместе с
компьютером IBM PC XT появилась возможность загрузки с жесткого
диска и, видимо, недалек тот час, когда появится возможность се-
тевой загрузки.
Системная область диска, загружаемая в память начальным заг-
рузчиком, называется вторичным загрузчиком. В случае MS-DOS, ра-
ботающей на IBM - совместимом компьютере, это самый первый сектор
диска длиной 512 байт. Такой маленький размер объясняется тем
фактом, что BIOS находится в ПЗУ. Вторичному загрузчику, в этом
случае, для загрузки остальной части системы достаточно обратить-
ся к BIOS, которая всегда находится в ПЗУ. В системах, не содер-
жащих BIOS в ПЗУ, начальный загрузчик должен считывать с диска
программу, способную обеспечить возможность вторичному загрузчику
считать остальную часть системы. В таких системах начальный за-
грузчик должен считывать довольно большую часть диска.
Сама MS-DOS загружается только после того, как будет считан в
память вторичный загрузчик. Именно по этой причине возможен за-
пуск игр, не требующих для своей работы MS-DOS, или возможна заг-
- 6-5 -
рузка других операционных систем. Собственно, тип загружаемой
системы зависит от того, что именно считывается с загрузочного
диска. При загрузке MS-DOS вторичный загрузчик предполагает нали-
чие на диске корневого директория и, как минимум, двух системных
файлов. В связи с тем, что эти файлы скрытые, они не отображаются
при выводе содержимого корневого директория (однако, их можно
увидеть при помощи таких утилит, как XTREE, Norton Utilities или
SDIR). Функции этих файлов одинаковы у всех поставщиков, хотя
имена могут различаться. Первый файл содержит ядро MS-DOS и обыч-
но называется MSDOS.SYS или IBMDOS.COM на системах фирмы IBM.
Другой файл содержит интерфейс между MS-DOS и подсистемой вво-
да-вывода и называется IO.SYS (Microsoft), IBMBIO.COM (IBM) или
еще как-нибудь у других поставщиков. Вместе эти два файла состав-
ляют операционную систему MS-DOS. После того, как вторичный за-
грузчик находит и загружает эти файлы, начинается процесс инициа-
лизации MS-DOS. Заметим, что на IBM-совместимых системах
вторичный загрузчик считывает только файл IBMBIO.COM, который, в