На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 6 / Команда INIT Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Команда INIT

      ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
      є                                                                  є
      є  Команда INIT (0)                                                є
      є                                                                  є
      є  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД         ЪДДДї                  є
      є  +00 : 23                   Длина         і X і Блок. драйверы   є
      є  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД         АДДДЩ                  є
      є  +01 :                 Устройство         ЪДДДї                  є
      є  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД         і X і Симв. драйверы   є
      є  +02 : 00                 Команда         АДДДЩ                  є
      є  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД                                є
      є  +03 :                     Статус                                є
      є  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД          ЧТЕНИЕ      ЗАПИСЬ    є
      є                   Зарезервировано                                є
      є  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДДї ДДДДД ЪДДДї ДДД є
      є  +13 :       Количество устройств          і   і       і X і     є
      є  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДД є
      є  +14 :                Адрес конца          і   і       і X і     є
      є  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДД є
      є  +18 :          Команда/Адрес BPB          і X і       і X і     є
      є  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДД є
      є  +22 :           Номер устройства          і X і       і   і     є
      є  ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ ДДДДД АДДДЩ ДДД є
      є                                                                  є
      є  Адрес таблицы BPB возвращается только блоковыми драйверами.     є
      є  Номер устройства поддерживается начиная с DOS 3.10.             є
      є                                                                  є
      ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј

Команда INIT (инициализация) всегда является самой первой вызываемой командой и обрабатывается на этапе установки драйвера. MS-DOS выдает эту команду для каждого драйвера только один раз. На команду INIT возложена ответственность за информирование MS-DOS об особых характеристиках драйвера и за выполнение необходимых действий по инициализации драйвера. Последние зависят от типа устройства, управляемого драйвером. Возвращаемые драйвером характеристики также зависят от типа драйвера.


Все драйверы должны возвращать адрес последнего байта памяти, занимаемой драйвером и количество устройств, управляемых драйвером. Драйверы символьных устройств могут поддерживать не более одного устройства. Блоковые драйверы могут поддерживать несколько устройств (например, если в одном устройстве содержится несколько дисководов). Кроме того, драйвер может вернуть ноль в качестве параметра количества поддерживаемых устройств, для прекращения процесса инициализации. Это может потребоваться, к примеру, при обнаружении отсутствия устройства. В такой ситуации драйвер должен также установить адрес последнего используемого байта равным CS:0 (текущий кодовый сегмент, нулевое смещение) для того, чтобы MS-DOS могла использовать всю занимаемую драйвером память. В нормальной ситуации адрес завершения представляет собой адрес (сегмент и смещение) первого свободного после драйвера байта памяти. MS-DOS продолжает загрузку системы начиная со следующего после адреса завершения параграфа памяти (или начиная с адреса завершения, если он приходится на границу параграфа).


Третий параметр, определяемый командой INIT - это адрес таблицы BPB. Этот указатель, возвращаемый MS-DOS командой INIT, представляет собой адрес таблицы, которая сама представляет собой совокупность указателей на блоки параметров BIOS. Таблица BPB содержит по одному указателю на каждое устройство, поддерживаемое драйвером. Блок параметров BIOS (или, короче, BPB) это структура, которая определяет формат блокового устройства (см. рис.6-6). Так как этот параметр имеет смысл только для блоковых устройств, он не возвращается символьными драйверами. Однако поле указателя таблицы BPB в блоке запроса несет еще одну полезную нагрузку, которая может быть использована обоими типами драйверов - это поле содержит адрес командной строки драйвера. У нас еще будет возможность подробнее обсудить назначение этого поля.


               СМЕЩЕНИЕ                СОДЕРЖАНИЕ                  РАЗМЕР
                (hex)
                        ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД·
                  +0    і        Размер сектора в байтах        є   Слово
                        ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  +2    і    Количество секторов в кластере     є   Байт
                        ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  +3    і Количество зарезервированных секторов є   Слово
                        ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  +5    і         Количество таблиц FAT         є   Байт
                        ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  +6    і    Количество элементов директория    є   Слово
                        ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  +8    і    Количество логических секторов     є   Слово
                        ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  +A    і          Описатель  носителя          є   Байт
                        ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  +B    і    Количество секторов в одной FAT    є   Слово
                        ФНННННННННННННННННННННННННННННННННННННННј
                        Рисунок 6-6. Блок параметров BIOS

Последний параметр, уникальный для команды INIT, это номер устройства. Этот параметр, который поддерживается только в MS-DOS версии 3.10 и более поздних, используется для задания начального номера устройства. К примеру, если драйвер должен управлять дисками C: и D:, содержимое этого поля будет равно 2 и количество устройств будет равным двум. Если драйвер должен управлять только дисководом A:, то номер устройства будет равен 0, а количество устройств 1. Эта возможность очень важна, так как она позволяет в конце концов заменять стандартные блоковые драйверы на драйверы, устанавливаемые пользователем.


Команда INIT является уникальной, так как из всех команд драйвера, она выполняется в среде, близкой к той, в которой выполняются обычные программы. В отличие от остальных команд, команда INIT может использовать функции MS-DOS с 01H по 0CH и 30H. Указанные функции позволяют драйверу выдать идентифицирующее сообщение во время установки и, если нужно, отобразить состояние конфигурации драйвера. Функция 30H ("Получить версию DOS") позволяет драйверу настроиться на определенную версию MS-DOS, что дает возможность разработчику писать драйверы, работающие с любой версией операционной системы.


Другое сходство команды INIT с обычными программами MS-DOS заключается в том, что INIT может прочитать командную строку драйвера и использовать ее для конфигурации драйвера. Как уже указывалось, команда DEVICE в файле CONFIG.SYS имеет следующий формат :


                DEVICE=[d:][path]filename[.ext][ parameters]

При обращении к драйверу с командой INIT драйверу передается адрес буфера, содержащего текст командной строки. Этот адрес передается в поле указателя таблицы BPB блока заголовка и указывает на первый после знака "=" символ командной строки. Для получения необходимой информации процедура инициализации должна просмотреть командную строку, пропустив спецификации файла, и обработать переданные параметры. Однако, в отличие от стандартных программ, команде INIT передается только адрес командной строки, а не сама строка. Командную строку при этом можно только читать (и ни в коем случае не модифицировать). Для блоковых драйверов это адрес, конечно же, должен будет перекрыт адресом таблицы BPB.


MS-DOS обращается к драйверу с командой INIT только единожды во время загрузки системы, поэтому код, реализующий обработку этой команды после завершения последней, будет бесполезно занимать память. Для того, чтобы минимизировать использование памяти драйвером, можно располагать код команды INIT после предполагаемого адреса завершения или отводить место, занимаемое процедурой инициализации, для внутренних буферов драйвера (драйвер RDISK использует пространство, занимаемое командой INIT, как часть буфера памяти). В любом случае память будет заново использована либо MS-DOS либо драйвером. Все остальные процедуры, реализующие остальные команды, должны располагаться до адреса завершения.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz