Скачиваний:
47
Добавлен:
01.05.2014
Размер:
96.26 Кб
Скачать

Санкт-Петербургский Государственный Электротехнический Университет.

Кафедра АПУ

Курсовик по Системному Программному ОБеспечению.

Выполнили:

гр. 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

Соседние файлы в папке Курсовик по Системному Программному Обеспечению