|
|
|
|
Создание драйверов устройств
Создание драйверов в любой операционной системе имеет много преимуществ перед написанием обычных программ. Драйверы устройств
должны следовать строго определенной структуре, а если структура понятна, то остальное приложится.
Базовая структура драйвера устройства показана на рис.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
---------------------------------------------------------------------
|
|
|