- •Системное программное обеспечение
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Структура MS DOS
- •Системное программное обеспечение
- •Общие сведения о драйверах
- •Общие сведения о драйверах
- •Общие сведения о драйверах
- •Общие сведения о драйверах
- •Общие сведения о драйверах
- •Заголовок драйвера
- •Заголовок драйвера
- •Заголовок драйвера
- •Заголовок драйвера
- •Стратегия устройства
- •Стратегия устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Обработчик прерывания устройства
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Дocтуп к дpaйвepу уcтpoйcтвa
- •Системное программное обеспечение
- •Общие сведения о резидентных программах
- •Общие сведения о резидентных программах
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Установка резидентной программы
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Защита резидентной программы от повторной установки
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
- •Выгрузка резидентной программы из памяти
Обработчик прерывания устройства
Пример обработчика прерывания символьного драйвера.
CMD_TAB LABEL |
BYTE |
|
DW |
INITIALIZATION |
; 0-Инициализация |
DW |
MEDIA_CHECK |
; 1-!Контроль носителя |
DW |
GET_BPB |
; 2-!Получение ВРВ |
DW |
IOCTL_INPUT |
; 3-IOCTL-ввод |
DW |
INPUT |
; 4-Ввод |
DW |
ND_INPUT |
; 5-*Неразрушающий ввод |
DW |
INPUT_STATUS |
; 6-*Состояние ввода |
DW |
INPUT_FLUSH |
; 7-*Очистка ввода |
DW |
OUTPUT |
; 8-Вывод |
DW |
OUTPUT_VERIFY |
; 9-Вывод с контролем |
DW |
OUTPUT_STATUS |
;10-*Состояние вывода |
DW |
OUTPUT_FLASH |
;11-*Очистка вывода |
DW |
IOCTL_OUT |
;12-IOCTL-вывод |
DW |
OPEN |
;13-Открытие устройства |
DW |
CLOSE |
;14-Закрытие устройства |
DW |
REMOVABLE |
;15-Сменный носитель |
DW |
OUTPUT_BUSY |
;16-*Вывод до занятости |
DW |
COMMAND_17 |
;17-Не определена |
DW |
COMMAND_18 |
;18-Не определена |
DW |
GENERIC_IOCTL |
;19-!Общий IOCTL |
DW |
COMMAND_20 |
;20-Не определена |
DW |
COMMAND_21 |
;21-Не определена |
DW |
COMMAND_22 |
;22-Не определена |
DW |
GET_DEVICE |
;23-Получение логического устройства |
DW |
SET_DEVICE |
;24-Установка логического устройства |
; !-не применимы для символьных, *-не применимы для блочных устройств
MSG |
DB |
'THIS IS DOS-DRIVER' |
|
DB |
0DH,0AH,07H,'$' |
BUFF |
DB |
0,0,0,0,0 ;Тестовый буфер |
CNT |
DB |
0 |
Обработчик прерывания устройства
DEV_INT: |
|
|
|
PUSH |
DS |
|
PUSH |
ES |
|
PUSH |
AX |
|
PUSH |
BX |
|
PUSH |
CX |
|
PUSH |
DX |
|
PUSH |
DI |
|
PUSH |
SI |
|
MOV |
AX,CS:RH_SEG |
|
MOV |
ES,AX |
|
MOV |
BX,CS:RH_OFF |
|
MOV |
AL,ES:[BX+2] |
|
SHL |
AL,1 |
|
LEA |
DI,CS:CMD_TAB |
|
MOV |
AH,0 |
|
ADD |
DI,AX |
|
JMP |
WORD PTR[DI] |
INITIALIZATION: |
; 0-Инициализация |
|
|
MOV |
AX,CS |
|
MOV |
DS,AX |
|
LEA |
DX,CS:MSG |
|
MOV |
AH,9 |
|
INT |
21H |
|
LEA |
AX,CS:END_OF_PROG |
|
MOV |
ES:[BX+14],AX |
|
MOV |
ES:[BX+16],CS |
|
JMP |
SUCCESS_EXIT |
OPEN: |
|
;13-Открытие устройства |
CLOSE: |
|
;14-Закрытие устройства |
|
MOV |
CS:CNT, 0 |
JMP |
SUCCESS_EXIT |
|
Обработчик прерывания устройства
OUTPUT: |
; 8-Вывод |
MOV |
SI,ES:[BX+14] |
MOV |
AX,ES:[BX+16] |
MOV |
DS,AX |
MOV |
DL,DS:[SI] |
LEA |
SI,CS:BUFF |
ADD |
SI,CS:CNT |
MOV |
DS:BYTE PTR [SI],DL |
INC |
CS:CNT |
JMP |
SUCCESS_EXIT |
MEDIA_CHECK: |
; 1-!Контроль носителя |
GET_BPB: |
; 2-!Получение ВРВ |
IOCTL_INPUT: |
; 3-IOCTL-ввод |
INPUT: |
; 4-Ввод |
ND_INPUT: |
; 5-*Неразрушающий ввод |
INPUT_STATUS: |
; 6-*Состояние ввода |
INPUT_FLUSH: |
; 7-*Очистка ввода |
;OUTPUT: |
; 8-Вывод |
OUTPUT_VERIFY: |
; 9-Вывод с контролем |
OUTPUT_STATUS: |
;10-*Состояние вывода |
OUTPUT_FLASH: |
;11-*Очистка вывода |
IOCTL_OUT: |
;12-IOCTL-вывод |
;OPEN: |
;13-Открытие устройства |
;CLOSE: |
;14-Закрытие устройства |
REMOVABLE: |
;15-Сменный носитель |
OUTPUT_BUSY: |
;16-*Вывод до занятости |
COMMAND_17: |
;17-Не определена |
COMMAND_18: |
;18-Не определена |
GENERIC_IOCTL: |
;19-!Общий IOCTL |
COMMAND_20: |
;20-Не определена |
COMMAND_21: |
;21-Не определена |
COMMAND_22: |
;22-Не определена |
GET_DEVICE: |
;23-Получение логического устройства |
SET_DEVICE: |
;24-Установка логического устройства |
JMP ERROR_EXIT
Обработчик прерывания устройства
ERROR_EXIT: |
|
||
|
MOV |
ES:WORD PTR [BX+3],8103H |
|
|
JMP |
EXIT |
|
SUCCESS_EXIT: |
|
||
EXIT: |
MOV |
ES:WORD PTR [BX+3],0100H |
|
POP |
SI |
||
|
|||
|
POP |
DI |
|
|
POP |
DX |
|
|
POP |
CX |
|
|
POP |
BX |
|
|
POP |
AX |
|
|
POP |
ES |
|
|
POP |
DS |
|
|
RET |
|
|
END_OF_PROG: |
|
||
DR |
ENDP |
|
|
CSEG |
ENDS |
|
|
END |
|
|
|
Дocтуп к дpaйвepу уcтpoйcтвa
Для подключения драйвера пользователя к операционной системе файл CONFIG.SYS должен содержать команду:
DEVICE=<путь_файла_драйвера> <параметры>
Например:
DEVICE=c:\dos\smartdrv.sys 120
Зaтeм необходимо пepeзaгpузить cиcтeму для уcтaнoвки дpaйвepa. Ecли мaшинa нe будeт зaгpужaтьcя, тo cкopee вceгo имeeтcя oшибкa в кoдe инициaлизaции дpaйвepa.
Пocлe тoгo кaк дpaйвep уcтaнoвлeн, для дocтупa к нeму можно пoльзоваться oбычными функциями MS DOS пpepывaния 21H. Kaкиe функции мoжнo иcпoльзoвaть зaвиcит oт тoгo, зaмeняeт ли уcтpoйcтвo cтaндapтнoe уcтpoйcтвo MS DOS или oнo дoбaвляeтcя кaк coвepшeннo нoвoe уcтpoйcтвo.
Дocтуп к дpaйвepу уcтpoйcтвa
1.Для зaмeны cтaндapтнoгo уcтpoйcтвa используются функции прерывания 21H, предназначенные для этих устройств, например:
для дpaйвepа AUX функция 3 пpepывaния 21H будет ocущecтвлять ввoд, а функция 4 вывoд:
MOV |
AH, 03H |
INT |
21H |
; в регистре AL – символ со стандартного |
|
последовательного канала |
|
MOV |
AH, 04H |
MOV |
DL, ‘A’ |
INT |
21H |
; |
выводит символ в регистре DL в |
Дocтуп к дpaйвepу уcтpoйcтвa
для драйвера PRN функции 5 прерывания 21H:
MOV |
AH, |
05H |
MOV |
DL, |
‘A’ |
INT |
21H |
|
; выводит символ в |
регистре DL на печать |
|
Дpугoй вoзмoжнocтью являeтcя иcпoльзoвaниe функции 3FH для ввoдa и 40H прерывания 21H для вывoдa. B этoм cлучae нужно иcпoльзовать дескриптор 3 – для пocлeдoвaтeльнoгo уcтpoйcтвa и 4 - для пapaллeльнoгo. Пpи иcпoльзoвaнии стандартных устройств с пpeдoпpeдeлeнными дескрипторами нeт нeoбxoдимocти oткpывaть и закрывать уcтpoйcтвo.
При этом вызываются функции драйвера 4 (INPUT_DATA) для ввода, 8 (OUTPUT_DATA) для вывода.
Дocтуп к дpaйвepу уcтpoйcтвa
2.Для драйвера нового устройства можно использовать функции для работы с файлами.
Для работы с драйверами обычно используется алгоритм работы с файлами:
а) устройство нужно открыть б) провести необходимые операции с устройством (ввод, вывод, опрос состояния и т.п.)
в) закрыть устройство Для символьных драйверов при этом должны быть
разрешены операции открытия/закрытия (бит 11 поля атрибутов драйвера в заголовке драйвера).
Дocтуп к дpaйвepу уcтpoйcтвa
Для открытия устройства используется функция открытия файла 3DH прерывания 21H. Номер функции находится в регистре AH, пара регистров DS:DX должна содержать адрес строки с именем драйвера, заканчивающейся нулем. В регистре AL указывается режим открытия: 0 – для чтения, 1 – для записи, 2 – для чтения и записи. При этом вызывается функция 13 (OPEN) драйвера. При возврате из прерывания в регистре AX возвращается дескриптор устройства.
Для вывода данных в устройство можно использовать функцию записи в файл 40H прерывания 21H. Номер функции находится в регистре AH, дескриптор устройства – в BX, пара регистров DS:DX должна содержать адрес буфера, содержащего записываемые данные, CX – число записываемых байт. При вызове
Дocтуп к дpaйвepу уcтpoйcтвa
Для чтения данных можно использовать функцию чтения из файла 3FH прерывания 21H. Номер функции находится в регистре AH, дескриптор устройства – в BX, пара регистров DS:DX должна содержать адрес буфера для чтения данных, CX – число считываемых байт. При вызове прерывания управление передается функции драйвера 4 (INPUT_DATA).
Для обеспечения прямой связи между прикладной программой и драйвером устройства можно также использовать функцию IOCTL, т.е. функцию 44H прерывания 21H. Она позволяет программе получать аппаратно-зависимую информацию и запрашивать операции, которые не поддерживаются другими функциональными вызовами MS DOS.
