свою очередь, загружает IBMDOS.COM.
Как только загружен интерфейсный файл (IO.SYS или его эквива-
лент), вторичный загрузчик передает управление процедуре инициа-
лизации, содержащейся в интерфейсном файле. Кроме этой процедуры
интерфейсный файл содержит стандартные драйверы, которые будут
использоваться при инициализации и работе MS-DOS.
Сама процедура инициализации заключается в распределении час-
тей MS-DOS в памяти, создании всех внутренних таблиц, рабочих об-
ластей и т.п., и, наконец, инициализации всех устройств, связан-
ных с системой. Инициализация устройств заключается в посылке
команды INIT каждому из драйверов, содержащихся в интерфейсном
файле (мы обсудим команду INIT позже, совместно с другими коман-
дами для драйверов устройств). После инициализации устройств про-
цедура инициализации заканчивает создание внутренних таблиц и
система к этому моменту готова к работе. До окончательного завер-
шения, однако, остается еще один шаг.
В этой точке процедура инициализации проверяет наличие файла
CONFIG.SYS. Если указанный файл отсутствует, то MS-DOS загружает
стандартный интерпретатор команд и передает ему управление. Если
же файл CONFIG.SYS найден, то выполняется еще один шаг инициали-
зации. На этом этапе Вам предоставляется возможность подключить к
MS-DOS Ваши собственные драйверы устройств.
Файл CONFIG.SYS
Файл CONFIG.SYS это обычный текстовый файл, который должен
быть расположен в корневом директории диска, с которого происхо-
дит загрузка системы (если этот файл находится не в корневом ди-
ректории, то процедура инициализации предполагает, что он совсем
отсутствует). Файл CONFIG.SYS содержит команды, руководствуясь
которыми процедура инициализации изменяет и/или дополняет стан-
дартную конфигурацию MS-DOS. Если этот файл доступен, процедура
инициализации (но не COMMAND.COM - он еще не загружен) считывает
его в память и обрабатывает строка за строкой. Каждая строка со-
держит одну команду конфигурации. На диаграмме 6-1 показана обра-
ботка некоторых команд. Наиболее важна для нас команда DEVICE,
которая имеет следующий формат:
DEVICE=[d:][path]filename[.ext][ parameters]
- 6-6 -
где (заключенные в квадратные скобки элементы не являются обя-
зательными):
d: - идентификатор дисковода,
path - путь к драйверу,
filename - имя файла, содержащего драйвер,
ext - расширение имени файла,
parameters - параметры для драйвера.
Эта команда задает необходимость установки нового драйвера.
Программа драйвера, содержащаяся в заданном драйвере, похожа на
обычную .COM программу, но имеет некоторые специфические особен-
ности, описываемые далее, в разделе, посвященном написанию драй-
веров.
В общем случае, драйвер представляет собой особую форму рези-
дентной программы. Когда в файле CONFIG.SYS встречается команда
DEVICE, соответствующий драйвер загружается в память и анализиру-
ется. Заголовок драйвера содержит информацию о типе, имени, атри-
бутах устройства и определяет точки входа в программу. После заг-
рузки драйвера MS-DOS обращается к драйверу с командой INIT.
Драйвер выполняет инициализацию и возвращает управление MS-DOS,
указывая адрес конца драйвера, т.е. адрес первого свободного бай-
та памяти, непосредственно следующего за драйвером. На этом уста-
новка драйвера заканчивается.
Указание адреса конца драйвера при возвращении управления
MS-DOS после выполнения команды INIT подобно указанию размера па-
мяти, занимаемой программой, при вызове функции MS-DOS "Остаться
резидентом". По возвращаемому адресу MS-DOS определяет расположе-
ние свободной памяти. Если файл CONFIG.SYS содержит другие коман-
ды DEVICE, следующий драйвер загружается непосредственно после
предыдущего. После того, как обработка файла CONFIG.SYS законче-
на, загружается еще один драйвер - драйвер фиктивного устройства
(NUL-драйвер). Затем MS-DOS завершает инициализацию загрузкой
постоянной части COMMAND.COM или другой, определяемой пользовате-
лем оболочки.
При загрузке драйверов MS-DOS связывает их в цепочку, так что-
бы каждый драйвер содержал ссылку на ранее загруженный драйвер.
Цепочка драйверов начинается, таким образом, с последнего загру-
женного драйвера (NUL-драйвер) и заканчивается самым первым заг-
руженным драйвером (обычно стандартный драйвер устройства COM2).
Такая цепочка строится, используя первые два слова заголовка каж-
дого драйвера. Эти два слова содержат сегмент и смещение следую-
щего в цепочке драйвера или, в случае последнего драйвера число -
1 (шестнадцатиричное значение FFFF). Пример цепочки драйверов по-
казан в листинге 6-6, приведенном в конце этой главы.
Когда MS-DOS требуется обратиться к определенному драйверу,
она начинает поиск по цепочке драйверов (начиная с NUL-драйвера)
в порядке, обратном тому, в котором драйверы были загружены. Пос-
ле того, как требуемый драйвер найден, MS-DOS обращается к нему с
соответствующей командой. Последовательность поиска в цепочке при
этом такова, что если загружен пользовательский драйвер, имя ко-
торого совпадает с именем какого-либо стандартного драйвера (та-
кого как CON, AUX или PRN), драйвер пользователя будет найден
первым. Это позволяет пользователю заменять стандартные драйверы
(например, заменить стандартный CON-драйвер на ANSI.SYS CON-драй-
вер).
Стандартные драйверы в действительности загружаются и инициа-
лизируются до того как файл CONFIG.SYS будет считан и обработан.
- 6-7 -
ЪДДД¬ ЪДДД¬
¦ 1 ¦ ¦ 2 ¦
АДВДЩ АДВДЩ
АДДДВДДДЩ
ЪДДД¬
¦ 3 ¦
АДВДЩ
/ \ Да
< 4 >ДДДДДДДД>В<ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
\ / ¦
¦Нет / \ Да ¦
¦ < 5 >ДДДДДДДДДДДДДДДДДДДДДДДДДДД¬ ¦
¦ \ / ¦
¦<ДДДДДДДДДДДЩНет ЪДДД¬ ¦
¦ 7 ¦ ¦
ЪДДД¬ АДВДЩ ¦
¦ 6 ¦ Да / \ ¦
АДВДЩ ЪДДДДДДД< 8 > ¦
¦ \ / ¦
¦ ЪДДД¬ ¦Нет ¦
/ \ Да ¦ 9 ¦ ¦
< 12 >ДДДДДДДДД¬ АДВДЩ ЪДДД¬ ¦
\ / ¦ 10¦ ¦
¦Нет ЪДДД¬ ЪДДД¬ АДВДЩ ¦
¦ 13¦ ¦ 11¦ ¦ ¦
ЪДДД¬ АДВДЩ АДВДЩ ¦
¦ 14¦ ¦ АДДДДДДДДДДДДДДДДДДДЩ
АДВДЩ ¦
¦ ¦
¦<ДДДДДДДДДДДЩ
¦
ЪДДД¬
¦ 15¦
АДДДЩ
Блок-схема 6-1. Процесс инициализации MS-DOS.
1 - Теплая загрузка (при нажатии клавиш Ctrl+Alt+Del)
2 - Холодная загрузка (кнопка "СБРОС" или включение питания)
3 - Загрузка системы
4 - Файл CONFIG.SYS существует ?
5 - Есть еще строки в CONFIG.SYS ?
6 - Загрузка и запуск требуемого командного процессора (по
умолчанию это COMMAND.COM)
7 - Чтение строки из файла CONFIG.SYS
8 - Это команда "DEVICE=" ?
9 - Загрузка указанного в команде "DEVICE=" файла и подключение
его к цепочке драйверов
10 - Обработка какой-либо из команд "BREAK=","BUFFERS=","FILES="
или "SHELL="
11 - Обращение к драйверу с командой "INIT="
12 - Файл AUTOEXEC.BAT существует ?
13 - Выполнение всех обнаруженных в AUTOEXEC.BAT команд
14 - Выполнение программ DATE и TIME
15 - Выдача системного приглашения "A:>"
- 6-8 -
Это позволяет процедуре инициализации драйвера использовать неко-
торые функции MS-DOS для вывода сообщений или настройке драйвера
на конкретную версию операционной системы. Без всякой опаски мо-
гут быть использованы функции MS-DOS с 01H по 0CH, которые обес-
печивают работу с устройствами CON, PRN и AUX, а также функция
30H ("Получить версию MS-DOS"). Вызовов, относящихся к работе с
файлами или управлением памятью, следует избегать, так как рас-
пределение памяти полностью еще не завершено.
После того, как файл CONFIG.SYS обработан и драйверы проиници-
ализированы, стандартные драйверы устройств CON, PRN и AUX закры-
ваются и заново открываются операционной системой для того, чтобы
могла произойти замена (если таковая предусмотрена) указанных
драйверов. Начиная с этого момента используются только новые
драйверы.
Определенные драйверы не могут быть заменены пользователем.
Один из них - это драйвер пустого (фиктивного) устройства NUL.
Это объясняется тем фактом, что MS-DOS использует NUL-драйвер в
качестве начала цепочки драйверов. Так как встроенный NUL-драйвер
всегда определяет начало цепочки драйверов, то первым всегда бу-
дет найден встроенный NUL-драйвер. Схематический пример цепочки
драйверов показан на рисунке 6-1. Подробно назначение каждого из
указанных полей будет объяснено позже. Драйвер, помеченный как
последний, в действительности был первым устанавливаемым драйве-
ром, а драйвер, находящийся сразу после NUL-драйвера (в цепочке)
устанавливался самым последним.
ЪДДДДДДДДДДДД· ЪДДДДДДДДДДДД· ЪДДДДДДДДДДДД·
¦ Указатель є ¦ Указатель є ¦ Маркер є
¦ на первый ЗДДДДДДДД>¦ на ЗДДДДДДДД>¦ последнего є
¦ драйвер є ¦ следующий є ¦ драйвера є
¦ є ¦ драйвер є ¦ ( -1 ) є
ГДДДДДДДДДДДД¶ ГДДДДДДДДДДДД¶ ГДДДДДДДДДДДД¶
¦ Атрибуты є ¦ Атрибуты є ¦ Атрибуты є
ГДДДДДДДДДДДД¶ ГДДДДДДДДДДДД¶ ГДДДДДДДДДДДД¶
¦ Указатель є ¦ Указатель є ¦ Указатель є
ЪДДДДДґ на є ЪДДДДДґ на є ЪДДДДДґ на є