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










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

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

Создание драйверов устройств

Создание драйверов в любой операционной системе имеет много преимуществ перед написанием обычных программ. Драйверы устройств должны следовать строго определенной структуре, а если структура понятна, то остальное приложится.


Базовая структура драйвера устройства показана на рис.6-3. Обязательно должны присутствовать три раздела драйвера -- ЗАГОЛОВОК ДРАЙВЕРА, ПРОГРАММА СТРАТЕГИЙ и ПРОГРАММА ПРЕРЫВАНИЙ. Программа ПРЕРЫВАНИЙ это не тоже самое, что программа обработки прерываний, которая может присутствовать в качестве необязательной части работающего по прерываниям драйвера. На самом деле, программа ПРЕРЫВАНИЙ - это точка входа в драйвер для обработки получаемых от MS-DOS команд.


                               ЪДДДДДДДДДДДДДДДДДДДДДДДДД·
                               і   Заголовок драйвера    є
                               ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
                               і Область данных драйвера є
                               ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
                               і   Программа СТРАТЕГИЙ   є
                               ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
                               і         Вход в          є
                               і   программу ПРЕРЫВАНИЙ  є
                               ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
                               і    Обработчик команд    є
                               ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
                               і   Программа обработки   є
                               і       прерываний        є
                               ГДДДДДДДДДДДДДДДДДДДДДДДДД¶
                               і Процедура инициализации є
                               ФНННННННННННННННННННННННННј

                     Рисунок 6-3. Структура драйвера в MS-DOS

В программе 6-1 представлен скелет драйвера устройства. Хотя структура драйвера похожа на структуру .COM программы, важно отметить следующие отличия :


1. Программа начинается с нулевого смещения, а не 100H.


2. Образ программы начинается с директив определения данных для заголовка драйвера.


3. Программа не содержит директивы ASSUME для стекового сегмента.


4. Программа не содержит директивы END START.


         Листинг 6-1. Заголовок драйвера, программы СТРАТЕГИЙ и ПРЕРЫВАНИЙ
        ------------------------------------------------------------------

    DRIVER    SEGMENT PARA
              ASSUME  CS:DRIVER,DS:NOTHING,ES:NOTHING
              ORG     0
    START     EQU     $                       ; Начало драйвера
    ;
    ;******* ЗАГОЛОВОК ДРАЙВЕРА *******************************************
    ;
              dw      -1,-1            ; Указатель на следующий драйвер
              dw      ATTRIBUTE        ; Слово атрибутов
              dw      offset STRATEGY  ; Точка входа в программу STRATEGY
              dw      offset INTERRUPT ; Точка входа в программу INTERRUPT
              db      8 dup (?)        ; Количество устройств/поле имени
    ;
    ;******* РЕЗИДЕНТНАЯ ЧАСТЬ ДРАЙВЕРА ***********************************
    ;
    req_ptr   dd      ?                ; Указатель на заголовок запроса
       .
       .
       .
    ;
    ;******* ПРОГРАММА СТРАТЕГИИ ******************************************
    ;
    ; Сохранить адрес заголовка запроса для программы СТРАТЕГИЙ в REQ_PTR.
    ; На входе адрес заголовка запроса находится в регистрах ES:BX.
    ;
    STRATEGY  PROC    FAR
              mov     cs:word ptr [req_ptr],bx
              mov     cs:word ptr [req_ptr + 2],bx
              ret
    STRATEGY  ENDP
    ;
    ;******* ПРОГРАММА ПРЕРЫВАНИЙ *****************************************
    ;
    ; Обработать команду, находящуюся в заголовке запроса. Адрес заголовка
    ; запроса содержится в REQ_PTR в форме СМЕЩЕНИЕ:СЕГМЕНТ.
    ;
    INTERRUPT  PROC    FAR
              pusha                    ; Сохранить все регистры
               lds     bx,cs:[req_ptr]  ; Получить адрес заголовка запроса
                .
                .
                .
     INTERRUPT  ENDP
                .
                .
                .
     DRIVER    ENDS
               END

     ---------------------------------------------------------------------

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

Hosted by uCoz