Санкт-Петербургский Государственный Электротехнический Университет.
Кафедра АПУ
Курсовик по Системному Программному ОБеспечению.
Выполнили:
гр. 1321
Волох К.А.
Петренко В.
Вариант 1
Проверил:
Пашинский Н.В.
СПб. 2003г.
Содержание.
Введение. 3
Курсовое задание. 4
Проектирование драйвера устройства. 5
Исходный текст драйвера. 6
Исходный текст прикладной программы. 12
Заключение. 14
Введение
В данной работе необходимо создать драйвер виртуального устройства, для системы MS-DOS, обеспечивающий взаимодействие устройства с прикладными программами, обслуживающие это устройство (передача параметров, включение определенных функций устр-ва и т.д.
Хотелось бы отметить роль драйверов устройств в системе MS-DOS. C помощью драйверов обеспечивается взаимодействие внутренней системы (в нашем случае MS-DOS с внешними устройствами). И действительно, как можно подключить какое-то неизвестное компьютеру устройство, поддерживающее определенный протокол, определенный тип данных, определенные команды, не зная архитектуры устройства. И вот таким интерпретатором команд выступает драйвер. Он распознаёт команду, посланную прикладной программой, работающей в MS-DOS, преобразует ее в необходимый формат и пересылает устройству инструкции, которые необходимо выполнить. И при необходимости возвращает в MS-DOS статус выполнения команды, MS-DOS пересылает этот статус прикладной программе. Передача параметров происходит в определенных форматах. Без драйверов было бы очень трудно организовать взаимодействие между компьютером и внешним устройством, т.к пришлось бы заранее программировать все возможные обработчики для любого внешнего устройсва.
Курсовое задание
Вариант 1. Учебный драйвер виртуального таймера
Функция виртуального таймера состоит в измерении временного интервала и формировании сигнала по его истечении. Длительность интервала задается числом переполнений ("тиков") системного таймера. Сигнал формируется путем установки значения 01h в заданной ячейке памяти.
Функции драйвера
1. Установка параметров и запуск виртуального таймера.
Формат блока параметров описывается следующей структурой:
prm STRUC
addr_ofs DW ? ;смещение переменной сигнала
addr_seg DW ? ;сегмент переменной сигнала
time DW ? ;интервал времени в тиках
prm ENDS
2. Чтение времени, оставшегося до сигнала.
Программный интерфейс
Функция драйвера Функция DOS
Установить параметры 4403H
Читать параметры 4402H
Проектирование драйвера устройства
Так как работа устройства невозможна без установки параметров, то целесообразно включить устройство только после передачи параметров, т.е подключать пользовательское прерывание после выполнения команды IOCTL_OUT.
В драйвере использованы следующие данные:
RH_OFF DW - 2-х байтовый офсет блока запроса к устройству
RH_SEG DW - 2-х байтовый сегмент блока запроса
MSG – указатель на сообщение, появляющееся при подключении драйвера к DOS
PARAM - 6-и байтовый блок параметров.
OLD_SEG DW - начальный сегмент обработчика INT 1Сh
OLD_OFS DW - начальное смещение обработчика INT 1Сh
Драйвер поддерживает 5 команд:
INITIALIZATION ;Инициализация
IOCTL_INPUT ; 3-IOCTL-ввод
IOCTL_OUT ;12-IOCTL-вывод
OPEN ;13-Открытие устройства
CLOSE ;14-Закрытие устройства
При обращение к драйверу с недопустимыми командами, в слово статуса будет возвращаться код ошибки.
Слово атрибутов драйвера равно C800h, значит устройство является символьным, поддерживающим IOCTL управление.
По истечении количества тиков в ячейке памяти PARAM.ADDR_SEG:PARAM.ADDR_OFS формируется значение 01h и в динамике происходит кратковременный сигнал, указывающий на истечение заданного времени.(TIME=0)
Текст драйвера
;*******************************************************************************
; Учебный драйвер символьного устройства
;*******************************************************************************
CSEG SEGMENT PARA PUBLIC 'CODE'
ORG 0
DR PROC FAR
ASSUME CS:CSEG, DS:CSEG, ES:CSEG
PUBLIC DEV_INT,DEV_STRATEGY,INITIALIZATION,OPEN,CLOSE,OUTPUT,END_OF_PROG
;
;*******************************************************************************
; Структуры заголовков запроса
;*******************************************************************************
;
RH STRUC ;Фиксированная часть заголовка для любой команды
RH_LEN DB ?
RH_UNIT DB ?
RH_CMD DB ?
RH_STATUS DW ?
RH_RES1 DD ?
RH_RES2 DD ?
RH ENDS
;
RH0 STRUC ;Структура заголовка для команды 0
RH0_RH DB SIZE RH DUP(?)
RH0_NUNITS DB ?
RH0_BRK_OFS DW ?
RH0_BRK_SEG DW ?
RH0_BPB_TBO DW ?
RH0_BPB_TBS DW ?
RH0_DRV_LTR DB ?
RH0 ENDS
;
RH8 STRUC ;Структура заголовка для команды 8
RH8_RH DB SIZE RH DUP(?)
RH8_MEDIA DB ?
RH8_BUF_OFS DW ?
RH8_BUF_SEG DW ?
RH8_COUNT DW ?
RH8 ENDS
;
PRM STRUC
ADDR_OFS DW ?
ADDR_SEG DW ?
TIME DW ?
PRM ENDS
;*******************************************************************************
; Заголовок устройства DOS
;*******************************************************************************
;
NEXT_DEV DD -1
ATTRIBUTE DW 0C800H
STRATEGY DW DEV_STRATEGY
INTERRUPT DW DEV_INT
DEV_NAME DB 'MY_ALARM'
;
;*******************************************************************************
; Область данных драйвера
;*******************************************************************************
RH_OFF DW ?
RH_SEG DW ?
MSG DB 0AH,0DH,'THIS DRIVER OF VIRTUAL ALARM DEVICE',0AH,0DH,'WAS CREATED BY VOLOKH K.A. IN 2003 YEAR',0AH,0DH,'$'
PARAM DB 6 DUP (?)
OLD_SEG DW ?
OLD_OFS DW ?
;
; Таблица команд
;
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-Установка логического устройства
; !-не применимы для символьных, *-не применимы для блочных устройств
;*******************************************************************************
; Процедура СТРАТЕГИЯ
;*******************************************************************************
;
DEV_STRATEGY:
MOV CS:RH_SEG, ES
MOV CS:RH_OFF, BX
RET
;*******************************************************************************
; Процедура ПРЕРЫВАНИЕ
;*******************************************************************************
;
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].RH_CMD
SHL AL,1
LEA DI,CS:CMD_TAB
MOV AH,0
ADD DI,AX
JMP WORD PTR[DI]
;
;*******************************************************************************
; Локальные процедуры
;*******************************************************************************
;
INIT PROC NEAR
PUSH DS
MOV AX,CS
MOV DS,AX
LEA DX,CS:MSG
MOV AH,9
INT 21H
POP DS
RET
INIT ENDP
SET PROC
CLI
PUSH ES
MOV AX,0
MOV ES,AX
LEA AX,USER_1C
MOV ES:70H,AX
MOV ES:72H,CS
POP ES
STI
RET
SET ENDP
USER_1C PROC
PUSH ES
PUSH BX
MOV AX,CS:PARAM.ADDR_SEG
MOV ES,AX
MOV BX,CS:PARAM.ADDR_OFS
MOV AL,ES:[BX]
CMP AL,01H
JE M2
MOV AX,CS:PARAM.TIME
CMP AX,0001H
JE M3
DEC AX
MOV CS:PARAM.TIME,AX
JMP M1
M3:
;SET
MOV AL,01H
MOV ES:[BX],AL
JMP M1
M2:
MOV AL,0B6H
OUT 43H,AL
IN AL,61H
OR AL,3
OUT 61H,AL
PUSH CX
MOV CX,0ffffH
L1:
MOV AX,0100H
OUT 42H,AL
XCHG AL,AH
OUT 42H,AL
LOOP L1
POP CX
IN AL,61H
AND AL,0FCH
OUT 61H,AL
POP BX
POP ES
CALL UNSET
IRET
M1:
POP BX
POP ES
IRET
USER_1C ENDP
UNSET PROC
CLI
PUSH ES
MOV AX,0
MOV ES,AX
MOV AX,CS:OLD_OFS
MOV ES:70H,AX
MOV AX,CS:OLD_SEG
MOV ES:72H,AX
POP ES
STI
RET
UNSET ENDP
;
;*******************************************************************************
; Обработка команд DOS
;*******************************************************************************
;
INITIALIZATION: ; 0-Инициализация
CALL INIT
PUSH ES
MOV AX,0
MOV ES,AX
MOV AX,ES:70H
MOV CS:OLD_OFS,AX
MOV AX,ES:72H
MOV CS:OLD_SEG,AX
POP ES
LEA AX,END_OF_PROG
MOV ES:[BX].RH0_BRK_OFS,AX
MOV ES:[BX].RH0_BRK_SEG,CS
JMP SUCCESS_EXIT
OPEN: ;13-Открытие устройства
CLOSE: ;14-Закрытие устройства
JMP SUCCESS_EXIT
IOCTL_OUT:
MOV AX,ES:[BX].RH8_BUF_SEG
MOV DS,AX
MOV DI,ES:[BX].RH8_BUF_OFS
MOV AX,DS:[DI].ADDR_SEG
MOV CS:PARAM.ADDR_SEG,AX
MOV AX,DS:[DI].ADDR_OFS
MOV CS:PARAM.ADDR_OFS,AX
MOV AX,DS:[DI].TIME
MOV CS:PARAM.TIME,AX
CALL SET
JMP SUCCESS_EXIT
IOCTL_INPUT:
MOV AX,ES:[BX].RH8_COUNT
CMP AX,02H
JNE ERROR_EXIT
MOV AX,ES:[BX].RH8_BUF_SEG
MOV DS,AX
MOV DI,ES:[BX].RH8_BUF_OFS
MOV AX,CS:PARAM.TIME
MOV DS:[DI].TIME,AX
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:[BX].RH_STATUS,8103H
JMP EXIT
;
SUCCESS_EXIT:
MOV ES:[BX].RH_STATUS,0100H
EXIT:
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