Лабораториялық жұмыс №15.

Тақырып: Құрылғы драйверлерін жасау.

Жұмыс мақсаты: Студенттерді драйверлердің жүйелік бағдарламаларын жазудың жалпы принциптерін үйрету.

Теориялық мәліметтер:

Құрылғы драйверлерін жасау.

Құрылғы драйвері бұл арнайы бағдарлама, шеттегі құрылғымен алмастыруды басқарады, мысалы принтер немесе диск жинақтағыш сияқты. Сондықтан бұл шеттегі құрылғылардың параметрлері өндірушіге өндірушіден өзгереді, онда бағдарлама әр түрлі пайдаланушыларына әртүрлі драйверлердің дюжинасы керек болады, ол онда бар болатында жабдықтауында жұмыс істей алады. Бағдарламаға құрылғылардың драйверлердің қосудың 4 тәсілі болады:

1. Барлық драйверлерге үшін кодты тура бағдарламаға орналастыруға болады. Мысалы, әртүрлі принтерлер сүйеу үшін, жүйеліліктерді басқаратын кестені құруға болады және әрдайым қашан ол керек болғанда одан қажетті кодты іздеуге болады. Бұл көп жадты қажет қылады және жеткілікті баяу болуы мүмкін.

2. Құрылғы драйверлерінің қатарын құру және талап ету, ол қажетті бағдарламаны жүктейді (яғни, оны бағдарлама облысына орналастыру, арнайы қалдырылған бұл мақсатқа [1.3.5]).

3. Құрылғы драйверін бөлек бағдарлама ретінде құру, жүйе жүктелгенде орындалатын командалық файлда көрсетіледі. Бағдарлама іске қосылады және үзулерді өңдеу бағдарламасы ретінде бағдарлама құрылғы драйверлерін орнатады. Осыдан кейін бұл бағдарлама аяқталынады, бірақ [1.3.4] түсіндірілгендей, жадта қалады. Бағдарламаның аяғында бұл драйвер үзу векторы арқылы қолданады.

4. Толық құнды құрлығы драйверлерін құру, старт кезінде CONFIG.SYS. файл көмегімен жүктеледі. MS DOS осындай типті құрылғы драйверлерін қолданады және бір күні жүктелген DOS барлық мүмкін командаларын қолдана алады, қателердің тексеруін қоса. Арнайы командасы IOCTL (енгізу/шығару бақылау) бағдарламаға драйвер статусын білуге рұқсат етеді және басқарушы жолды оған жіберу , әдеттегі берілгендер ағынына қарағанда.

Орнатылатын құрылғы драйверлері тек қана Ассемблер тілінде жазылады. Олар екі типті құрылғыларды қызмет ете алады: символдық және блоктық. Бұлар құрылғы өңдейтін берілгендердің бірліктерін сипаттайды. Блоктық құрылғылардың қарапайым драйверлері диск жинақтағыштарды қызмет етеді, ал символдық драйверлері барлық қалғанын, жүйелі принтерлерден бастап және жұмыспен аяқтайды. Блоктық құрылғылар берілгендер блогімен алмастырлады, сондықтан олар басқарушы құрылығылар болып келеді және жоғары жылдамдықты берлігендерді алмастыру құрылғылар болады. Блоктық құрылғылардың драйверлері өте күрделі және осында, және олардың құрылымын түсіндіретін жеткілікті орын жоқ. Кімге сондай драйвер жазу өте сирек. MS DOS техникалық басшылғы қажетті ақпараттың бәрін пайдалануына береді және оперативиті жадтың виртуалды диск драйвер толық үлгісі құрады. Сіздер бұл ақпаратты, осында келтірілген символдық құрылғы драйверлердің талқылауын зерттеген соң көріп шыға алаcыздар.

Орнатылатын құрылғы драйверлері бағдарламашының қателерге аяусыз. Өйткені драйверлер жүйемен автоматты түрде жүктеледі, себептердің табуына арналған жөндеушілер қолдану мүмкін емес. Сондықтан оларды жазуда шекті ықыласты болыңыздар.

Құрылғы драйверлерінің бағдарламасы үш бөлімге бөлінеді, әрбірі келсі бөлімдерде бөлек талқыланады. Бұл (1) драйвер тақырыбы, яғни құрылғы атайды және драйвердің қалған бөліктері туралы ақпараттан тұрады, (2) драйвер стратегиясы, берілгендер облысы туралы ақпаратты сақтайды, MS DOS құрылатын, яғни сауал тақырыбы деп аталады, және (3) құрылғыны үзу өңдеушісі, яғни, құрылғымен басқаратын кодтан тұрады.

Драйвер тақырыбын жасау.

Құрылғылардың драйверлері COM файлы түрінде жасалу тиіс. Бірақ олар қазіргі бағдарламалармен келмейді, өйткені оларда бағдарламалық сегмент префиксі жоқ болады. Оған жету үшін, COM файлдағыдай, бағдарлама басында ORG 100H операторын қосудың қажеті жоқ. ORG 0 жазығыз, немесе жалпы ештеңе жазбаңыздар. Драйвер кез келген бағдарламадағыдай ұзақ (far) процедура ретінде сипатталады. Төменде көрсетілген мысалда, DEVICE12 атты құрылғы драйверіне арналған бастапқы код келтірілген. Ол MS DOS қолданылатын. стандартты AUX құрылғысын ауыстырады, 21Н үзу 4 функциясын шығаруды қабылдайды. Құрылғы барлық драйвері бұл бөлім кодымен келесі екі бөлімде келтірілген кодпен болады; толық бағдарламаны алу үшін, оларды бірінен соң бірін қатар орналастырыңыздар.

Құрылғы драйвері, драйвер тақырыбынан басталу тиісті. Ол 18 байтты ұзындықты болады, және 5 өріске бөлінген. Бірінші өріс (DD), әрқашан 1 мағынасынан (FFFFFFFFH) тұрады, және қашан MS DOS драйверді жүктегенде, онда ол келісі драйвердің старттық адресімен ауыстырылады. Сондықтан, жүйе тізбекпен келесі драйверді іздей алады. Соңғы жүктелеген драйвер өрісінде 1 мағынасы қалады.

Екінші өріс бұл драйвер атрибуттарының байты. Бұл сөздің тек қана 7 бит мағынасына ие болады:

бит 15 1 = символдық құрылғы, 0 = блоктық құрылығы

14 1 = сүйейді IOCTL, 0 = сүйемейді IOCTL

13 1 = блоктар форматы IBM, 0 = блоктардың басқа форматы

3 1 = сағат, 0 = сағат емес

2 1 = нөлдік құрылғы, 0 = нөлдік емес құрылғы

1 1 = стандартты шығару құрылғысы 0 = жоқ

0 1= стандартты енгізу құрылғысы, 0= жоқ. Әдетте тек қана бит 15 орнатылған, немесе 15 және 14 биттер, егер құрылғы IOCTL сүйейді ([7.2.4] талқыланады). Бит 13 тек қана үшін блоктық құрылғыларда орнатылады. Қалған биттер MS DOS қолданылатын үнсіз келісім бойынша құрылғылардың ауыстыру үшін қолданылады (стандартты енгізу/шығару құрылғылары пернетақта және видеодисплей болып келеді; BIOS тәуліктік уақыт сағаттарымен уақыттардың нақты сағаттардың құрылғысын сағаттар біріктіреді; ал нөлдік құрылғы (NULL ), тесттік мақсаттар үшін қолданылатын).

Үшінші және төртінші өрістер стратегиялар процедуралары және үзулер өңдеу қызметтен алу үшін арналған, келесі бөлімдерде қаралады. Соңғы өріс құрылғы атынан тұрады. Аты 8 символдан тұруы мүмкін және ол аяқтайтын бос орынменсол жаққа туралану тиіс. DOS бар LPT1 немесе COM1 сияқты құрылғысы ауыстыру үшін, берілген мысалдағыдай, сондай құрылғы атын қолданыңыздар.

Берілген мысалда жүйелі құрылғыға арналған драйвер жасалады. "DEVICE12" файл аты, файлда жүйе конфигурациясы көрсетілуі тиіс, бұл драйвер жүктелген. Атрибуттар байтында тек қана бит 15 анықталған, ол символдық құрылғыны көрсете отырып, және ол IOCTL сүйемейді. Құрылығы AUX деп аталған, MS DOS қарапайым құрылғысын осы атпен ауыстыру үшін арналған. DEV_STRATEGY немесе DEV_INTERRUPT процедуралар аттары, келесі бөлімдерде талқыланады. Бұл құрылғыға өте қарапайым қатнасыуға рұқсат етеді, сондықтан жүйе AUX құрылғысына қатнасу үшңн файл нөмірі алдын ала анықталған болады (жүйелі түрде). Мысалда драйверге арналған бастапқы код қосылған, COM бағдарлама сияқты оны анықтақтайды.

CSEG SEGMENT PUBLIC 'CODE' 'код сегментін орнатамыз

ORG 0 'бұл жол аса қажет емес

ASSUME CS:CSEG,DS:CSEG,ES:CSEG

DEVICE12 PROC FAR 'драйвер бұл ұзақ процедура

DD 0FFFFFFFFH 'келесі драйвер адресі

DW 8000H 'атритбуттар байты

DW DEV_STATEGY 'стратегия процедура адресі

DW DEV_INTERRUPT 'үзу процедура адресі

DB 'AUX ' 'құрылғы аты (бос орындармен толықтыру)

Құрылғы стратегиясын жасау.

Құрылғы стратегия процедурасы тек қана бес жол ғана талап етеді. Жүйе құрылғыларды жүктеген кезде, онда ол сауал тақырыбымен деп аталатын берілгендер блогін жасайды. Ол екі функцияға ие болады. Біріншіден, ол жүйе ішкі операцияларына арналған берілгендер облысын қызмет етеді. Ең маңыздысы, сауал тақырыбы облыспен қызмет етеді, ол арқылы бағдарламамен оны шақыратын драйверлер арасында ақпарат алмастыру жүреді. Мысал, драйвер берілгендерді шығарғанда, онда оған сауал тақырыбы арқылы берілгендер адресі беріледі. Драйвер өз жұмысын аяқтаған кезде, онда ол сауал тақырыбына статус байтын орнатады, ол шақырылатын бағдарламаға рұқсат болады, сонымен бірге оған қате туралы білу мүмкіндік туғызады.

MS DOS құрылғы драйвері орнатуда сауал тақырыбын жасайды (жүйе жүктелген кезде). Құрылғы стратегия процедурасы выполняется бұл кезеңде бір рет қана орындалады. Сол кезде ES:BX жаңадан, Ч жасалған сауал тақырыбын жаңадан және оларды процедура тек қана көшірмесін жасау керек, яғни, соңында ол драйверге қатынасу кезінде табылған болаатындай. Қызметтен алу адрестері және тақырыбы сегментіні екі айнымалыға орналастырылады. Келесі бөлімде сіздер көресіздер, драйверге қатнасу кезінде, біріншіден ол ES:BX мағыналары қалпына келтіреді, сауал тақырыбысынан ақпаратты алу үшін болады.

Сауал тақырыбы өлшемі өзгере алады, драйверге берілген сауал типіне байланысты (мысалы, инициализация, берілгендерді шығару немесе статус қайтаруы). Бірақ тақырыбының бірінші 13 байты әрқашан бірдей. Олардың форматтары мынадай:

1. Сауал тақырыбы ұзындығы (DB).

2. Құрылғы коды (DB). Блоктық құрылғыларға арналған нөмір анықтайды.

3. Команда коды (DB). Осында драйверге жіберілген соңғы команда нөмірі сақталады. Бұл кодтар [7.2.3] көрсетілген.

4. Статус (DW). Статус әрбір драйвер шақыру кезінде орнатылады. Егер бит 15 орнатылған болса, онда кіші сегіз биттерде қате коды болады. Қателердің кодтар [7.2.3] көрсетілген.

5. Резервтегі облыс (8 байт). MS DOS қолданылады.

6. Берілгендер драйверлер жұмысы үшін қажет. (айнымалы ұзындығы).

Міне құрылғы стратегия процедурасының 5 жолы. Екі сөздік айнымалы, ES немесе BX мағыналарын сақтайды. RET ережесіне негізделеді және COM форматында тиісті сияқты болады.

DEV_STRATEGY: MOV CS:KEEP_ES,ES

MOV CS:KEEP_BX,BX

RET

KEEP_CS DW ?

KEEP_BX DW ?

Құрылғыда үзу өңдеуші жасау.

Құрылғы драйвері алдындағы бөлімдерде келтірілген код екі порциясынан басталады.Олар үшін сәйкесінше үзуді өңдеуші процедурасы болу тиіс. Негізінен, мұны үзуді өңдеуші процедурасы деп атау дұрыс емес, өйткені ол үзуді еш қызмет етпейді және RET қарапайым ережесімен аяқталынады.

Функциялардың 13 типі болады, құрылғы орнатылған драйверін орындайды. Драйвер DOS функциясымен шақырылса (3FH функциямен, 21H үзуді, ол файлдан немесе құрылғыдан берілгендерді оқиды), онда функция кодты нөмір 1-ден 13 дейін бірбайтты өріс қызметтен алу 2 сауал тақырыбына орналастырады (енгізуге арналған кодты нөмір 5). Содан соң басқару драйвер үзулері өңдеуші процедурасына беріледі, драйвер тақырыбы көрсетілгенде адресі анықталады. Бұл процедура ең алдымен ES:BX қалпына келтіреді, олар сауал тақырыбын көрсету үшін, ал содан соң команда кодты нөмірін оқиды. Бұл үзуді өңдеуші процедура кодына керек процедураны шақырады,ол талап қойылатын функцияны орындайды. Процедура 13-сөздік кесте көмегімен ізделінеді, 13-типі функциялар үшін қызметтен алу тұрады. Функциялар әрқашан келесі ретте саналады:

1. INITIALIZE (инициализация)

2. CHECK_MEDIA (жинақтағышты тексеру)

3. MAKE_BPB

4. IOCTL_IN

5. INPUT_DATA (берілгендерді енгізу)

6. NONDESTRUCT_IN

7. INPUT_STATUS (енгізу статусы)

8. CLEAR_INPUT (енгізуді өшіру)

9. OUTPUT_DATA (берілгендерді шығару)

10. OUTPUT_VERIFY (шығаруды тексеру)

11. OUTPUT_STATUS (шығару статусы)

12. CLEAR_OUTPUT (шығаруды өшіру)

13. IOCTL_OUT

Процедура аяқталуы, үзуді өңдеуші процедурасы RET ережесімен аяқталынады және басқару шақырылған бағдарлама қайтып келеді. Құрылғы драйвері тек қана функциялардың өңдеуіне арналған кодты қоса алады, құрылғыға байланысты және қателердің бақылау қойылатын талап дәрежелері және басқарудың құрылғымен. Процедураларды жазылмаған функция номерлері, ештене орындамай, драйверден шығумен аяқтау тиісті. Бұл жағдайда шығу алдында сауал тақырыбында тек қана 15, 8, 1 және 0 биттерін орнату керек, шақырылатын тапсырманы хабарлау үшін, жоқ функция талап етілген болатын (бит 15 қатені, бит 8 драйвер нормал жұмыс істейтінін көрсетеді, ал 0 және 1 биттер код қателер 3 нормал береді, ол "белгісіз командаға" сәйкес болады).

Бірақ бір функция барлық құрылғы драйверлерінде қатысу тиісті, және бұл функция нөмір 1 инициализация. Бұл функция автоматты түрде драйвер жүктелгенде орындалады, ал содан соң жоқ. Бұл процедурамен орындалатын маңызды тапсырмалардың бірі, драйвер соңы адрестерін төрт байтты құрудан тұрады, сауал тақырыбында қызметтен алудан 14 басталады. Төменде көрсетілген мысалда бағдарлама соңы таңбамен белгіленген. Осы тапсырмадан басқа, процедура инициализациясы, берілген құрылығы инициализацияға қажеттінің бәрін орындауға тиісті. 7-4 суретте құрылғы драйверінің құрылымы көрсетілген.

Қалған 12-функциялардың қайсыс құрылғы драйверіне қосылған болады, драйвер не істеу керектігіне байланысты. Кейбірі, CHECK_MEDIA немесе MAKE_BPB сияқты тек қана блоктық құрылғыларға жатады (олар диск типін, секторлар өлешмін және т.б. орнатады). Символдық құрылғылар үшін ең маңызды екі функция: INPUT_DATA немесе OUTPUT_DATA (бұл функциялардың кестесінде позициясы маңызды, өзгермейтін). Екі жағдайда да сауал тақырыбының құрылымды келесідей болады:

13 байт сауал тақырыбының стандартты форматы

1 байт ортаны суреттеу байты (тек қана блоктық құрылғылар үшін)

4 байт қызметтен алу/берілгендермен алмасу буфер сегменті

2 байт жіберуге керек байттар саны

2 байт сектор старттық нөмірі (тек қана блоктық үшін)

Төменде көрсетілген мысалда шығару функциясы қолданылады. Шығаруды орындайтын процедура, сауал тақырыбысынан буфер адресін алады, онда шығарылатын берілгендер болады (қызметтен алу 14). Ол сонымен қатар шығаратын байттардың санын салыстырып оқиды (қызметтен алу 18). Процедура шығаруды қашан аяқтайды, онда ол сауал тақырыбысында статус сөзін орнатады (қызметтен алу 3) және басқаруға қайтарады. Егер операция табысты болса, онда 8 бит статус сөзі орнату керек. Басқа мүмкіншіліктерді талқылайтын боламыз.

Берілген мысалда үзуді өңдеуші процедура жалпы түрі келтірілген, нақты кодты, құрылғымен басқарушыны қоспай.

;--- құрылғы үзу өңдеуші инициализациясы

DEV_INTERRUPT: PUSH ES ;регистрлерді сақтаймыз

PUSH DS

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH SI

PUSH DI

PUSH BP

MOV AX,CS:KEEP_ES ;ES:BX сауал тақырыбына көрсетеді

MOV ES,AX ;

MOV BX,CS:KEEP_BX ;

MOV AL,ES:[BX]+2 ; тақырыбанан командас кодын аламыз

SHL AL,1 ;2 көбейтеміз (өйткені кесте сөздік)

SUB AH,AH ;AH нөлге теңестіру

LEA DI,FUNCTIONS ;DI кестеге дейін қызметтен алуға көрсетеді

ADD DI,AX ; ; кестеде қызметтен алуды қосамыз

JMP WORD PTR [DI] ;кестеден адреске өтеміз

FUNCTIONS LABEL WORD ; бұл функция кестесі

DW INITIALIZE

DW CHECK_MEDIA

DW MAKE_BPB

DW IOCTL_IN

DW INPUT_DATA

DW NONDESTRUCT_IN

DW INPUT_STATUS

DW CLEAR_INPUT

DW OUTPUT_DATA

DW OUTPUT_VERIFY

DW OUTPUT_STATUS

DW CLEAR_OUTPUT

DW IOCTL_OUT

;---драйверден шығу, егер функция сүйенбесе

CHECK_MEDIA:

MAKE_BPB:

IOCTL_IN:

INPUT_DATA:

NONDESTRUCT_IN:

INPUT_STATUS:

CLEAR_INPUT:

OUTPUT_VERIFY:

OUTPUT_STATUS:

CLEAR_OUTPUT:

IOCTL_OUT:

OR ES:WORD PTR [BX]+3,8103H ;статусты модификациялаймыз

JMP QUIT

;---сүйенетін екі код үшін процедура

INITIALIZE: LEA AX,E_O_P ;AX бағдарлама соңы қызметтен алуы

MOV ES:WORD PTR [BX]+14,AX ;оны тақырыбына орналастырамыз

MOV ES:WORD PTR [BX]+16,CS ;

.

(осында құрылғы инициализациясы жүреді )

.

JMP QUIT

OUTPUT_DATA: MOV CL,ES:[BX]+18 ; символдар санын аламыз

CBW CX ;CX есепші ретінде қолданамыз

MOV AX,ES:[BX]+16 ; берілгендер буферінің адресін аламыз

MOV DS,AX ;

MOV DX,ES:[BX]+14 ;

.

(осында шығарумен операциялар жүреді)

.

JMP QUIT

;---шығамыз, сауал тақырыбында статус байты модификациялай

QUIT: OR ES:WORD PTR [BX]+3,100H ; 8 бит орнатамыз

POP BP ;регистрлерді қалпына келтіреміз

POP DI ;

POP SI ;

POP DX ;

POP CX ;

POP BX ;

POP AX ;

POP DS ;

POP ES ;

RET

E_O_P: ;бағдарлама соңы таңбасы

DEVICE12 ENDP

CSEG ENDS

END DEVICE12

Қайтарудың алдында драйвер сауал тақырыбына статус сөзін орнатады. Берілген мысалда бұл екі жерде істеледі, драйвермен қамтамасыз етілетін функция шақырылғаны немесе жоқ болуына тәуелді. Бұл жолдар былай көрінеді: OR ES:WORD PTR [BX]+3,XXXXH. Биттер мағынасы XXXX келесідей:

0-7 биттер қате коды (егер бит 15=1)

8 бит 8 орнатылады 1, функция аяқталған кезде

9 бит орнатылады 1, қашан драйвер 10-14 биттермен бос емес кейінге сақталған MS DOS

15 бит орнатылады 1, қате пайда болғанада

Бұл сөздің кіші байты келесі қате кодтардан тұрады, егер 15 бит орнатылған болса, қатені:

0 жазудан қорғалған құрылғыға жазу әрекеті

1 белгісіз құрылғы

2 құрылғы дайын емес

3 белгісіз команда

4 бақылау сомасын тексеру қателігі

5 құрылғыға сауал сенімсіз ұзындығы

6 іздеу қателігі

7 белгісіз жинақтағыш

8 сектор табылған емес

9 принтерде қағаздар жоқ

А жазу қателігі

В оқу қателігі

С жалпы қателігі

Құрылғы драйверіне рұқсат.

Құрылғы драйвері жүйе конфигурация файлға дайын бағдарламаны қосу жолмен орнатылады. Сыналатын бағдарлама орнату үшін файлға CONFIG.SYS жолы DEVICE = DEVICE12.COM орналастырыңыздар. Содан кейін драйвер орнатк у үшін жүйені қайтадан жүктеу керек. Егер машина жүктелмесе, онда драйвер инициализациялар кодында қате болады.

Драйвер орнатылған соң, оған рұқсат алу үшін MS DOS қарапайым функциясы 21H үзу қолданыңыз. Қандай функциялар қолданатыны, құрылғы DOS стандартты құрылғысын ауыстыру (келтірілген мысал бойынша) немесе ол жетілген жаңа құрылғы сияқты қосылады. Стандарттыны жүйелі құрылғылар ауыстыру үшін, AUX драйвер атаңыздар, кейін 3[7.1.7] және 4[7.1.6] функциялар, 21Н үзулер сәйкесінше енгізу және шығару жүзеге асырады. Егер паралельді құрылғы болса, онда PRN атаңыздар, содан кейін 5[6.3.1] функция, берілгендерді принтерде шығарады. Басқа мүмкіншілігі енгізу үшін [5.4.4] және шығару үшін [5.4.3] функциясын қолдану болып табылады. Бұл жағдайда жүйелі құрылғылар үшін 3 файл нөмірін және паралельді үшін 4 қолданыңыздар. Еске саламыз, алдын-ала файл нөмірлерінің қолдануы жанында құрылғыны ашудың қажеттілігі жоқ.

Егер құрылғы MS DOS стандартты құрылғыларынан бірін ауыстырмаса (яғни, егер ол резервтегі сөздерден біреумен ғана аталмаса, мысалы PRN, AUX т.б. сияқты), онда сіздер құрылғыны файл ашуына арналған функциялардың бірімен аша алаcыздар. Сіздер рұқсат әдіс сияқты файл басқарушы блогінің көмегімен қолдана алаcыздар, мысалы және файл дескриптор әдісі. Сенім болу үшін, сіздер дисктік файлды қателік жасап ашу, файл нөмірін BX және 0-ді AL орналастырыңыздар, кейін 44H функциясын 21H үзуді орындаңыздар. Бұл функция IOCTL және егер мағынасы7 бит, DL қайтаратынды орнатылған, онда құрылғы драйвері жүктелген.

IOCTL талап етеді, драйвер атрибуттар байтында сәйкес биттердің орнатылуы және процедура негізі өңдеу IOCTL қалай дегенмен драйвер үзулері өңдеуші процедурасында болуын. IOCTL функциясы 8 ішкі функцияға ие болады, 0-ден 7-ге шейін нөмірленген, сонымен қатар кодты номер сәйкесінше функция шақыруы жанында AL орналаса бастайды:

0 DX –қа құрылғы туралы ақпаратты қайтару

1 DL (DH=0) қолданып, құрылғы туралы ақпаратты орнату

2 құрылғы драйверінен СХ байттарын басқарушы канал арқылы есептеу және оларды DS:DX бастап орналастыру

3 құрылғы драйверінен СХ байттарын басқарушы канал арқылы жазу және оларды DS:DX бастап орналастыру

4 яғни 2 сияқты, бірақ BL жинақтағыш нөмірі қолдану,

мұнда 0= жинақтағыш үнсіз келісім бойыша, 1= A және т.с.с.

5 яғни 3 сияұты, бірақ жинақтағыш нөмірін 5 сияқты қолдану

6 енгізу статусын алу

7 шығару статусын алу

Жауапқа әртүрлі ақпарат қайтып келеді, ол қандай функция шақырылғанына байланысты. Ішкі функция үшін DX регистр биттер мағынасы 0 және 1 келесідей (бит 7=1 шартында, файлға емес, құрылғыға рұқсат алынғанын білдіреді):

0 1=консоль енгізу құрылғысы

1 1=консоль шығару құрылғысы

2 1= нөлдік құрылғы

3 1= сағаттар құрылғы

4 резерв

5 1= Ctrl-Z –де тексеру жоқ, 0= Ctrl-Z –де тексеру бар

6 1= файл соңы емес, 0=файл соңы

7 1= құрылғы, 0= дисктік файл

8-13 резерв 14 1= егер ішкі функция 2 және 3 қолдануға болса, 0= болмайды 15 резерв

Ішкі функция 2-5, бағдарламаға және құрылғыға өз бетімен басқарушы жолдармен ауысу рұқсат етеді. Бұл басқарушы хабарламаларды негізгі берілгендер ағынынан бөлек жіберуге рұқсат етеді, бұл істі маңызды оңайлатады. АХ қайтаруында берілген байттардың саны тұрады. Ішкі функция 6-7 бағдарламаға тексеруді рұқсат етеді, енгізу немесе шығару үшін құрылғы дайындығын. AL құрылғылар үшін FF қайтып келеді, егер құрылғы дайын және, егер 0, онда жоқ. Ашық файлмен қолдану жанында (бит 7=0) AL үшін FF, файл соңы болғанша шейін қайтып келеді.

Құрылғы табылуы және қателерінің талдауы.

Құрылғылар үш себептің бірінде қателеседі. Құрылғы физикалық зақымдалған болуы мүмкін немесе басқа жағдайда болуы мүмкін. Құрлығыны басқаруда нашар бағдарламалық жабдықталған болуы мүмкін. Және, бағдарлама құрылғыға мүмкін емес сауал жібере алады (мысалы, жинақтағышқа жазу әрекеті, жазудан қорғалған дискета қайда орналасқан). MS DOS сондай қателердің көпшілігін және табады, талдайды және бұрынғы қалпына келтіру мүмкіншілігі қамсыздандырады.

Кейде құрылғы драйверлері үлкен қателерден тұрады, мұнда әдетте бағдарлама орындала алмайды, олар түзелгенше дейін. Сондай қателер болса, онда жүйе сын қателерді өңдеуші шақырады. Ол стандартты құрылғылар үшін және орнатылған драйверлер үшін де әрекет ете алады. Пайдаланушы дискжетекпен дисктік операцияны жасау барысында жиі кездеседі. Бұл жағдайда хабарлама шығады: "Not ready error reading drive A Abort , Retry , Ignore ?"

Сын қателердің өңдеушісі қайтадан жазылуы мүмкін, ол құрылғылар жақсырақ өңдеуі үшін, сіздер орнатылған драйверлер үшін жасадыңыздар. 24Н үзу векторы MS DOS стандартты процедурасына көрсетеді, бірақ сіз өз процедуранызға векторды қайта бағыттай алаcыздар. Бұл процедура шақыруында үлкен бит AH 0-ден тұрады, егер қате блоктық құрылғыда болса, және 1, егер символдықта. BP:SI кінәлі құрылғы драйвер тақырыбына көрсетеді, ол қосымша ақпаратты бере алады. Сегіз байт, тақырыбыда АН қызметтен алуынан бастай, құрылғы атынан тұрады, сын қателердің өңдеушісі қате кодын DI сөзге ұзындықпен орналастырады (олар бит позицияларын ұсынбайды):

Kод Проблема

0 жазудан қорғалған құрылғыға жазу әрекеті

1 белгісіз құрылғы

2 құрылғы дайын емес

3 белгісіз команда

4 берілгендермен алмасу қателігі

5 сауал сенімсіз ұзындығы

6 іздеу қателігі

7 белгісіз жинақтағыш типі

8 сектор табылған емес

9 принтерде қағаздар жоқ

А жазу кезіндегі қателік

В оқу кезіндегі қателік

С жалпы қателігі

Дисктік қателік жағдайында AL жинақтағыш нөмірінен тұрады, қайсыда қате болыд (0=A ,1=B және т.с.с.), ал 2-0 биттер AH қате типін белгілейді. Бит 0 орнатылады, егер жазу операция уақытында қате болса, және түсіріледі егер оқу кезінде. 2-1 биттер ақпараттан тұрады, диск қандай орынында қате болғаны туралы, DOS бастапқы секторларына үшін 00 береді, FAT үшін 01, каталог үшін 10, және дисктің қалған барлығы үшін 11.

Үш тәсіл арқылы, бағдарлама сын қатеден кейін қалпына келе алады:

1. Қате себебін жою пайдаланушыдан сұрауға болады (мысалы, жинақтағыш есігін жабу), кейін жүйе құрылғыға қайталу операциясын пайдалану мүмкіншілігін береді.

2. Басқарма ережеге қайтарылуы мүмкін, келесі INT 21H кейін, ол драйверге қатынасу әрекетті істеді.

3. Бағдарлама аяқтай алуы мүмкін жіне жүйеге басқарманы қайтара алуы мүмкін.

Сіздің қателердің өңдеу процедурасы жағдайды қалпына келтіре алады, IRET ережесін беріп, AL ол 0 белгілеген соң, 1 операцияны қайталау үшін. қатені елемеу үшін, және 2 бағдарламаны аяқтап шығу үшін. Егер сіз, процедура қалпына келутіруді өзі өткізгенін қадасаңыз, онда ол стектен орындалатын бағдарлама регистрін қалпына келтіру тиісті, ал содан соң стектен барлығын өшіру, соңғы үш сөзден басқасын. Кейін бұл IRET ереже бағдарламаға басқарманы қайтарады, бірақ жүйенің өзі тұрақсыз жағдайда қалады, ол 12-ден үлкен нөмірмен функция шақырғанша дейін. Міне стек конфигурациясы (жоғарыдан бастап төменге дейін) қашан сын қателердің өңдеушісі шақырылады:

Қателердің өңдеуші қайтару адресі: IP, CS, жалаулар

Пайдаланушы тапсырмалар регистрі, AX, BX, CX, DX, SI, DI, BP, олардың ішінен драйвер шақырылған болатын: DS, ES, IP, CS, жалаулар

MS DOS сонымен қатар көптеген сынсыз қателер өңдейді. Қателердің кодтары мұнда қосылады, олар регистрге қайтып келе алады, қашан DOS функциясы шақырылды. Бұл кодтар берілген кітапта сәйкес функциялар сипатталатын жерде талқыланады. Бірақ MS DOS 3.0 нұсқасынан бастап, функцияларға арналған қателердің үлкейтілген кодтары қайтарып береді, FCB қолданатын немесе файлдардың дескрипторлары. Орындалу жанында бұл функцияларды бірінде тасымалдау жалауы орнатылса, онда АХ қарапайым қате коды қайтып келеді. 59Н үзу арқылы қосымша үлкейтілген код қолайлы, егер ВХ, 0-ді орналастыру. Сонымен қатар бұл функция сын қателер туралы хабарлайды және ол сын қателердің өңдеушісінен мүмкін қолданған, 24Н үзу арқылы шақырылған.

Функция АХ қате коды орналастырады, қарапайым таныс қателер код тізімінен алынған (мысалы, «жад жеткіліксіз») немесе бір жаңа кодтардан (мысалы ,"рұқсат шек қою" көп пайдалынушы жүйелер үшін). ВН қате кодын класын қайтарып береді, қате типін көрсетеді. Мысалы, код 1, көрсетеді, қорлар таусылған, яғни жад, файлдық буферлер немесе тағы бірдене жұмсалған. Басқа кластар бағдарламалық қателерді көрсете алады, жинақтағыштармен проблемалар, форматтаумен және т.б. BL кодтан тұрады, бұрынғы қалпына келу үшін әрекеттер, яғни, "қайталау", "тоқтату" немесе "пайдаланушыда сұрау". СН санды қайтарып береді, қайда жерде проблемалар пайда болғанын анықтаушы: блоктық құрылғыда, символдықта, жадта ма?

Тапсырма:

1. Блоктық құрылғының иілгіш дисктерде магниттік жинақтағыш драйвері жазу.

Әдебит: 10, бет.54-62; 23, бет.85-92; 8, бет.23-32.

Бақылау сұрақтар

1. Құрылғы драйвері деген не?

2. Құрылғы драйверлердің бағдарламаға қосудың қандай тәсілдері бар?

3. Құрылғы драйверлері қандай файлдар түрінде жасалу тиіс?

4. Құрылғы стратегиясы қандай мәнді білдіреді?

5. Құрылғы драйвері қалай орнатылады?

6. Құрылғылар неге қателеседі?