Sistem de operare ms-dos

Pentru a gestiona evenimentele care apar asincron cu privire la executarea programului, mecanismul de întrerupere funcționează cel mai bine. Întreruperea poate fi considerată un eveniment special în sistem, care necesită o reacție imediată. De exemplu, sistemele de fiabilitate bine concepute utilizează o întrerupere a unei alarme în rețea pentru a efectua proceduri de scriere a conținutului registrelor și a memoriei RAM pe suporturi magnetice astfel încât, după restabilirea alimentării, să poată fi continuate din același loc.







Se pare evident că o mare varietate de întreruperi sunt posibile din mai multe motive. Prin urmare, o întrerupere este tratată nu doar ca atare: un număr este asociat cu acesta, numit un număr de tip de întrerupere sau pur și simplu un număr de întrerupere. Fiecare eveniment este asociat cu fiecare număr de întrerupere. Sistemul este capabil să recunoască care întrerupere, cu care număr a avut loc, și începe procedura corespunzătoare acestui număr.

Programele pot solicita ele însele întreruperi cu un număr dat. Pentru aceasta, folosesc comanda INT. Acestea sunt așa-numitele întreruperi software. Întreruperile software nu sunt asincrone, așa cum sunt chemați din program (și știe când provoacă o întrerupere!).

Folosirea întreruperilor atunci când lucrați cu dispozitive externe lente vă permite să combinați I / O cu procesarea datelor în procesorul central și, ca rezultat, crește performanța generală a sistemului.

Unele întreruperi (primele cinci în ordine numerică) sunt rezervate pentru utilizarea chiar de către CPU în eventualitatea unor evenimente speciale, cum ar fi încercările de a diviza prin zero, preaplin, etc.

Uneori este de dorit ca sistemul să fie insensibil la toate întreruperile separate sau separate. Pentru a face acest lucru, utilizați așa-numita mascare de întreruperi, pe care o vom discuta în detaliu. Dar unele întreruperi nu pot fi mascate, acestea sunt întreruperi demascabile.

Rețineți, de asemenea, că operatorii de întrerupere pot declanșa întreruperi software, de exemplu, pentru a accesa serviciul BIOS sau DOS (serviciul BIOS este disponibil și prin mecanismul de întrerupere a software-ului).

Crearea propriilor programe de gestionare a întreruperilor și înlocuirea administratorilor standard DOS și BIOS este o sarcină responsabilă și complexă. Este necesar să se țină seama de toate subtilitățile funcționării echipamentului și interacțiunea dintre software și hardware. Când depanați, este posibil să distrugeți sistemul de operare cu consecințe imprevizibile, deci trebuie să monitorizați îndeaproape ceea ce face programul dvs.

Inițializarea tabelului are loc în parte în BIOS după testarea hardware-ului și înainte de pornirea sistemului de operare de boot, parțial atunci când este încărcat DOS-ul. DOS se poate comuta la unele întreruperi ale BIOS-ului.

Considerăm acum conținutul tabelului vectorial de întrerupere. Să dăm scopul câtorva dintre cei mai importanți vectori:

Întreruperea modului pas cu pas. Acesta este generat după fiecare executare a instrucțiunilor mașinii, dacă bitul pasului traseului TF este setat în cuvântul de pavilion. Folosit pentru depanarea programelor. Această întrerupere nu este generată după executarea instrucțiunii MOV în registrele segmentate sau după încărcarea registrelor segmentului cu comanda POP.

Hardware întreruperi care nu pot fi mascate. Această întrerupere poate fi utilizată diferit în diferite mașini. Acesta este de obicei produs atunci când apare o eroare de paritate în memoria principală și când se solicită o cerere de întrerupere de la coprocesor.

Întrerupeți pentru urmărire. Această întrerupere este generată atunci când se execută o instrucțiune de mașină cu un singur octet cu codul CCh și este de obicei folosită de către debugger pentru a seta punctul de întrerupere.

Overflow. Acesta este generat de instrucțiunea mașinii INTO, dacă este setat flagul OF. Dacă drapelul nu este setat, comanda INTO este executată ca NOP. Această întrerupere este folosită pentru a gestiona erorile atunci când efectuează operații aritmetice.

Imprimați o copie a ecranului. Acesta este generat când apăsați tastele PrtScr de pe tastatură. De obicei, pentru a imprima o imagine pe ecran. Pentru procesorul 80286, acesta este generat atunci când se execută instrucțiunea mașinii BOUND, dacă valoarea care urmează să fie testată este în afara intervalului specificat.

Un cod de operare nedefinit sau o lungime de comandă mai mare de 10 octeți (pentru procesorul 80286).

IRQ0 - IRQ15 sunt întreruperi hardware, acestea vor fi discutate mai târziu.

Adesea, atunci când secțiunile critice ale programelor sunt executate, pentru a asigura executarea unei anumite secvențe de comenzi, trebuie să dezactivați întreruperile. Acest lucru se poate face cu comanda CLI. Trebuie să fie plasat la începutul secvenței critice a comenzilor și, la sfârșit, este localizată comanda STI, care permite procesorului să accepte întreruperi. Comanda CLI dezactivează numai întreruperile mascate, cele care nu pot fi mascate sunt preluate întotdeauna de procesor.

Dacă utilizați comanda CLI pentru a dezactiva întreruperile, asigurați-vă că întreruperile nu sunt dezactivate pentru o perioadă lungă de timp, deoarece acest lucru poate duce la consecințe nedorite. De exemplu, ceasul va cădea în urmă.

Dacă trebuie să împiedicați toate întreruperile, dar numai unele, de exemplu, de la tastatură, atunci trebuie să utilizați serviciile controlerului de întrerupere. În detaliu cu privire la acest lucru puțin mai mic, acum observăm doar faptul că, prin emiterea unor informații de control controlorului, este posibil să se ascundă întreruperile de la dispozitive individuale.

Este posibil ca programul dvs. să aibă nevoie de a organiza procesarea unor întreruperi. Pentru a face acest lucru, programul trebuie să reassigned vectorul de manipulare. Acest lucru se poate face schimbând conținutul elementului corespunzător în tabela vectorului de întrerupere.







Este foarte important să nu uitați, înainte de a închide, restaurarea conținutului vectorilor modificați în tabelul de întreruperi. după terminarea programului, memoria care i-a fost alocată este considerată gratuită și poate fi utilizată pentru a încărca un alt program. Dacă ați uitat să restaurați vectorul și a venit întreruperea, sistemul se poate prăbuși - vectorul indică acum o zonă care poate conține orice.

Funcția de întrerupere 21h 25h stabilește funcția de întrerupere DS: DX pentru vectorul cu numărul din AL.

Desigur, puteți să vă referiți direct la tabela vectorului de întrerupere, dar atunci când înregistrați, trebuie să mascați întreruperile cu comanda CLI, fără a uita să le permiteți după scrierea cu comanda STI.

Dacă aveți nevoie să adăugați orice acțiuni personalizate la ceea ce procedează la procedura de întrerupere standard, puteți aranja un lanț de întrerupere.

În biblioteca Quick C, există o funcție pentru organizarea lanțului de întrerupere - _chain_intr ().

Să analizăm în detaliu capacitățile bibliotecii mediului integrat Quick C, proiectat să lucreze cu întreruperi.

Modulul de întrerupere (_interrupt modifier pentru Quick C 2.5 și C 6.0) descrie o funcție care este un handler de întrerupere. Această funcție este terminată de comanda de retur din rutina de întrerupere IRET și generează automat comenzile pentru stocarea registrelor la intrare și restaurarea acestora la ieșirea din dispozitivul de întrerupere a întreruperii. Un exemplu de utilizare a unui modificator pentru a descrie funcția de manipulare întrerupere:

Întreruperea cuvântului cheie este, de asemenea, utilizată pentru a descrie variabilele destinate stocării vectorilor de întrerupere:

Modificatorii _interrupt și _far pentru Quick C 2.5 și C 6.0 sunt sinonime, respectiv întrerup și sunt departe.

Care sunt cerințele pentru rutina de întrerupere a serviciului?

Dacă întreruperile apar frecvent, atunci procesarea acestora poate încetini foarte mult aplicarea. Prin urmare, dispozitivul de tratare a întreruperii trebuie să fie un program scurt, rapid care să efectueze numai acțiunile cele mai necesare. De exemplu, luați în considerare următorul caracter din portul imprimantei și puneți-l în tampon, creșteți valoarea oricărui număr global de întreruperi și așa mai departe.

Pentru a seta procedura de tratare a întreruperii, utilizați funcția _dos_setvec. Această funcție are doi parametri - un număr de întrerupere și un indicator pentru o nouă funcție de manipulare a întreruperilor. De exemplu:

În acest exemplu, pentru o întrerupere de tastatură cu numărul 16h, este instalat un nou handler de întrerupere my_key_intr.

Următorul exemplu simplu ilustrează utilizarea tuturor celor trei funcții proiectate să funcționeze cu întreruperi. Acest program încorporează propriul handler de întrerupere cu temporizator, care va fi apelat de aproximativ 18,2 ori pe secundă. Un handler de întrerupere încorporat contorizează cronometrele de timer și, dacă valoarea contorului este mai mare de 20, se transmite un semnal audio către difuzorul calculatorului. La sfârșitul lucrării, noul handler pentru întreruperea temporizării cheamă vechiul handler utilizând funcția _chain_intr.

După instalarea unui nou handler de întrerupere a temporizării, programul principal așteaptă apăsarea oricărei taste pe tastatură, apoi restabilește conținutul vechi al vectorului de întrerupere.

Întreruperile hardware sunt generate de dispozitivele de calculator atunci când devine necesar să le deservi. De exemplu, prin întreruperea unui cronometru, dispozitivul de tratare a întreruperii corespunzător mărește conținutul celulelor de memorie utilizate pentru a stoca timpul. Spre deosebire de întreruperile programelor, care sunt programate de aplicația în sine, întreruperile hardware apar întotdeauna asincron cu privire la programele care rulează. În plus, mai multe întreruperi pot apărea simultan!

Pentru a ne asigura că sistemul "nu se confundă", hotărând care întrerupere trebuie să servească mai întâi, există o schemă specială de priorități. Fiecare întrerupere este atribuită proprie prioritate unică. În cazul în care mai multe întreruperi apar simultan, sistemul acordă prioritate la cea mai mare prioritate, întârziind prelucrarea întreruperilor rămase pentru un timp.

Sistemul prioritar este implementat pe două jetoane Intel 8259 (pentru mașinile XT - pe un astfel de cip). Fiecare cip servește până la opt priorități. Chipsurile pot fi combinate (cascaded) pentru a crește numărul de niveluri de prioritate din sistem.

Nivelurile prioritare sunt desemnate prin prescurtarea IRQ0 - IRQ15 (pentru mașinile XT există doar niveluri IRQ0 - IRQ7).

Pentru mașinile XT, prioritățile au fost dependente liniar de numărul de niveluri de întrerupere. IRQ0 acordat cea mai mare prioritate, urmat de mers pe jos IRQ1, IRQ2, IRQ3, și așa mai departe. Nivelul IRQ2 de masini XT-clasa a fost rezervat pentru o viitoare extindere a sistemului și începând cu mașini AT-clasă, IRQ2 a fost utilizat pentru întrerupere în cascadă controler 8259. Adăugat nivele de prioritate IRQ8 - IRQ15 în aceste mașini să acorde prioritate între IRQ1 și IRQ3.

Iată tabelul întreruperilor hardware situate în ordinea priorității:

IRQ7 - întrerupe imprimanta. Acesta este generat de imprimantă atunci când este gata să efectueze următoarea operație. Multe adaptoare de imprimantă nu utilizează această întrerupere.

Tabelul arată că cea mai mare prioritate este întreruperea temporizatorului de intervale, după care există o întrerupere de la tastatură.

Pentru a gestiona circuitele de prioritate, trebuie să cunoașteți dispozitivul intern al controlerului de întrerupere 8259. Întreruperile de intrare sunt stocate în registrul de solicitare a întreruperii IRR. Fiecare bit de opt din acest registru corespunde unei întreruperi. După verificarea prelucrării în momentul unei alte întreruperi, se solicită informații din registrul de servicii ISR. Înainte de a emite o cerere de întrerupere, procesorul verifică conținutul registrului mască de întrerupere IMR pe 8 biți. Dacă întreruperea acestui nivel nu este mascată, se emite o cerere de întrerupere.

Cele mai interesante din punct de vedere al programării controlerului de întrerupere sunt registrele de mască de întrerupere IMR și registrul de întrerupere a controlului.

Bitii registrului mască de întrerupere corespund numerelor IRQ. Pentru a masca hardware-ul întrerupe orice nivel, este necesar să se trimită un registru mască octet, în care bitul corespunzător acestui nivel este setat la 1. De exemplu, pentru a masca o întrerupere de la o 21h portul floppy trebuie să trimită numărul binar 01000000.

Iată un exemplu de program care ascunde o întrerupere de pe o dischetă:

Acest program se află pe discheta atașată la carte. Rulați (de pe hard disk) și încercați să lucrați, de exemplu, cu unitatea A. Nu veți reuși!

Pentru a "reînvia" dischetele, rulați programul care va demasca toate întreruperile (inclusiv discheta):

Observați că tocmai am deghizat întreruperea de pe dischetă, toate celelalte dispozitive au continuat să funcționeze normal. Dacă am lansat instrucțiunea mașinii CLI, toate întreruperile hardware ar fi dezactivate. Acest lucru ar conduce, de exemplu, la faptul că tastatura ar fi blocată.

Dacă procesați o întrerupere 1Ch, atunci nu este nevoie de un add-on la sfârșitul programului, deoarece această întrerupere este o extensie a unei alte întreruperi (întreruperea temporizatorului).

Înainte de a finaliza studiul întreruperilor, să ne întrebăm dacă este posibilă ascunderea unei întreruperi care nu poate fi mascată. Se pare că poți!

Desigur, dacă semnalul de întrerupere a ajuns la intrarea unei întreruperi a procesorului dezamăgit, nu se poate face nimic - o întrerupere va avea loc inevitabil. Dar în computerele XT și AT există scheme care blochează intrarea unei întreruperi ne-mascate a procesorului NMI.

În mod similar, pentru mascarea AT a întreruperii ne-mascate este controlată de bitul 7 al portului 70h. Scrierea unui octet 0ADh la portul 70h va dezactiva întreruperea care nu poate fi mascată, iar octetul 2Dh va permite ca întreruperea să treacă.

Rețineți că nu interzicem o întrerupere care nu poate fi mascată "în interiorul" procesorului - acest lucru este imposibil prin definiție, "nu lăsăm" semnalul de întrerupere la intrarea NMI.







Articole similare

Trimiteți-le prietenilor: