4.2. Заголовок драйвера

      Первые 18 битов драйвера должны иметь специальный формат; в

 них располагается заголовок драйвера следующего вида:

 

 Смещение Длина Содержимое       Комментарий

 ───────────────┬────────────────┬───────────────────────────────

  +0       4       Next Dev     │ Длинный адpес следующего

                ├────────┬───────┘ дpайвеpа

  +4       2    │Devattr │ Атpибуты устpойства

                ├────────┤

  +6       2    │Strategy│ Смещение до пpогpаммы стpатегии

                ├────────┤

  +8       2    │Interrupt Смещение до пpогpаммы пpеpывания

                ├────────┴────────────────────┐

  +0Ah     8       'LPT1     '               │ Имя устpойства

                └─────────────────────────────┘

  12h      Длина заголовка драйвера

 

      Опишем назначение полей заголовка.

 

      Поле NextDev должно содержать нули; при загрузке драйвера в

 память система  помещает в это поле  адрес следующего драйвера в

 формате  сегмент:смещение.   Если  смещение  =   FFFFh,  то  это

 последний драйвер.

 

      Поля  Strategy  и  Interrupt   -  16-битовые  указатели  на

 подпрограммы  в сегменте  кодов  драйвера.  При любом  запросе к

 драйверу  ДОС вызывает  программу стратегии,  передавая ей адрес

 запроса  в регистрах  ES:BX. Программа  стратегии должна  просто

 сохранить  этот  адрес  для  дальнейшего  использования (в общем

 случае,  поместить его  в  очередь)  и выполнить  вызов командоы

 RETF. В  дальнейшем ДОС вызывает  программу прерывания, уже  без

 параметров. Эта  программа должна извлечь  первый из сохраненных

 запросов и  исполнить его. После этого  драйвер должен заполнить

 слово состояния устройства и вернуться в ДОС командой RETF.

 

      Со смещения 0Ah располагается 8-битовое имя устройства. Для

 последовательных устройств в это  поле заносится имя устройства,

 дополненное справа пробелами (например,  CON, AUX, PRN, COM1 или

 LPT1). Для блочных устройств (дисков) используется только первый

 байт этого поля, в который помещается номер данного устройства.


 

      Наконец,  слово  атрибутов  устройства  содержит  различные

 характеристики устройства:

 

  1 1 1 1 1 1

  5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0

 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐

 │C│J│N│0│R│0│0│0│0│L│0│ │ │ │ │ │

 └┬┴┬┴┬┴─┴┬┴─┴─┴─┴─┴┬┴─┴┬┴┬┴┬┴┬┴┬┘ Бит:                   Маска:

  │ │ │               │ │ │ │ │

  │ │ │               │ │ │ │ └─>0:1=стандартное      a & 0001h

  │ │ │               │ │ │ │      устройство ввода

  │ │ │               │ │ │ └───>1:1=стандартное      a & 0002h

  │ │ │               │ │ │        устройство вывода

  │ │ │               │ │ └─────>2:1=стандартное      a & 0004h

  │ │ │               │ │          нуль-устройство

  │ │ │               │ └───────>3:1=часы (CLOCK$)    a & 0008h

  │ │ │               └─────────>4:1=специальное      a & 0010h

  │ │ │                            устройство (не используется)

  │ │ │            └─────────────>6:1=поддерживает     a & 0040h

  │ │ │                             логические устройства

  │ │ │   └──────────────────────>11:1=поддерживает     a & 0800h

  │ │ │                              буферизацию (ДОС 3.x)

  │ │ └──────────────────────────>13:1=нестандартное    a & 2000h

  │ │                                блочное устройство

  │ └────────────────────────────>14:1=поддерживает     a & 4000h

                                    IOCTL

  └──────────────────────────────>15:1=последователь-   a & 8000h

                                     ное устpойство, 0=блочное

      Примечания:

 

      1. Установите  биты 0-1, если  заменяете драйвер устройства

 CON.

 

      2.  Нуль-устройство   не  может  быть   переопределено  (не

 пытайтесь заменить устройство NUL; причина описана в 4.1).

 

      3. Бит  поддержки логических устройств  (ДОС 3.2) означает,

 что  устройство  может  выполнять запросы  17h и 18h  (см. 4.3),

 используемые  драйвером  DRIVER.SYS  для  управления "фантомными

 дисководами".

 

      4.  Бит  поддержки  буферизации  (ДОС  3.0)  означает,  что

 устройство  может выполнять  запросы  0Dh - 0Fh,  т. е.  блочное

 устройство  имеет  внутреннюю  буферизацию,  а  последовательное

 устройство может посылать синхронизирующие последовательности.

 

      5.  Бит  нестандартного   устройства  относится  к  дискам,

 имеющим  формат,  отличный  от   стандарта  IBM;  это влияет  на

 выполнение запроса 02h.

 

      6. Бит IOCTL означает,  что устройство поддерживает запросы

 03h, 0Ch и 13h.

 

      7.  Бит  последовательного  устройства  влияет  на  запросы

 ввода-вывода  и  определяет  содержимое  поля  "имя  устройства"

 

 в заголовке драйвера, как описано выше.  Если этот бит равен  0,

 то устройство является блочным (обычно, это дисковод).

 

      8. Бит часов указывает,  что данный драйвер должен заменять

 устройство  CLOCK$.  Часы  -  это  последовательное  устройство,

 обрабатывающее запросы  на ввод и  вывод ровно 6  байтов. Запрос

 ввода (с кодом 4) должен возвращать 6 байтов, содержащих текущие

 дату и время, а запрос вывода  (код 8) должен принимать 6 байтов

 для установки часов и календаря. Формат этих 6 байтов таков:

 

 Смещение  Длина  Содержание         Комментарий

 ─────────────────┬───────┬─────────────────────────────────────

  +0         2      Date │ Дата = число дней с 1 января 1980 г.

                  ├───┬───┘

  +2         1    │Min│     Минуты (0-59)

                  ├───┤

  +3         1    │Hrs│     Часы   (0-23)

                  ├───┤

  +4         1    │Sec│     Секунды (0-59)

                  ├───┤

  +5         1    │Hun│     Сотые доли секунды (0-99)

                  └───┘

 

 

Вы находитесь в разделе: 
Также вам будет интересно:

Комментарии

Добавить коментарий