Prekinitve in izjeme


Kaj so prekinitve?

Windows 2000 poznajo dve vrsti dogodkov, ki spremenijo potek izvajanja ukazov. Prekinitve(interrupts) in izjeme(exception).

Prekinitve so asinhroni dogodki, ki niso povezani s tem, kar procesor trenutno izvaja. Prekinitve najpogosteje sprožijo vhodno/izhodne enote, ura..... Lahko so omogočene ali pa onemogočene.

Izjeme pa so sinhroni dogodki, ki so povezani s trenutnim programom. Primeri izjem: deljenje z nič, kršenje pomnilniškega prostora....

Obe vrsti prekinitev lahko sproži tako strojna oprema kot programska oprema. "Bus error exception" je primer izjeme, ki jo je sprožila strojna oprema. Deljenje z nič pa je primer izjeme, ki jo je sprožil program. Prav tako lahko vzhodno/izhodna naprava sproži prekinitev ali pa samo jedro (kernel) sproži prekinitev (APC ali DPC).

Pod pastjo razumemo mehanizem, s katerim procesor ob pojavi prekinitve ali izjeme ujame tekočo nit in preskoči iz uporabniškega v sistemski režim ter skoči na izvajanje kode na neki vnaprej definirani  lokaciji.

Delovanje prekinitev in izjem?

Ko se zgodi dogodek, ki povzroči prekinitev izjemo ali pa klic sistemskega servisa, prevzame nadzor rokovalnik pasti(trap handler). Le ta začasno prepove nove prekinitve. Tvori okvir pasti (trap frame), v katerega shrani stanje prekinjene niti in omogoči prekinitve. Glede na vrsto zahteve, ki je povzročila klic rokovalnika pokliče ustrezen modul. Če je bila vzrok prekinitev potem pokliče prekinitveni distributor. V primeru sistemskega klica prepusti nadzor sistemskemu distributorju. V primeru ostalih pasti pa prepusti izvajanje distributorju izjem.


 
 

Aparaturne prekinitve

Distributor prekinitev, ki je del rokovalnika pasti se torej odziva na prekinitve. Distibutor najprej ugotovi izvor prekinitve in potem prenese nadzor v zunanjo rutino ki potem servisira prekinitev ali pa v notranjo kernel rutino. Zunanjo rutino morajo zagotavljati gonilniki naprave, notranje rutine pa zagotavlja kernel sam.

Različni procesorji prepoznajo različno veliko in raazlične tipe prekinitev. Kernel definira tabelo IRQL (interrupt request level). V tej tabeli so urejene prekinitve po prioriteti. Višja prekinitev ima višjo prioriteto. Procesor ima svoj kazalec IRQL, ki kaže v to tabelo in se spreminja glede na prekinitve. Prekinitve, ki ležijo pod tem kazalcem so onemogočene, dokler se kazalec IRQL ne pomakne navzdol.
 
 


 
 

Podobno vlogo, kot jo ima pri nekaterih drugih operacijskih sistemih prekinitveni vektor, igra pri Win 2000  distribucijska tabela prekinitev IDT (Interrupt Dispatch Table). IRQL procesorja služi kot kazalec tudi v to tabelo. IDT je  struktura, na katero kaže processor control region(PCR).

Interaktivni prikaz delovanja aparaturnih prekinitev

Pri večprocesorskih sistemih imamo ločeno tabelo IDT.
 

Prekinitve za klice zamaknjenih procedur DPC (deferred procedure call)

 
Periferne naprave povzročajo aparaturne prekinitve. Jedro  pa tvori programske prekinitve. Posebnost Win 2000 so prekinitve za klice zamaknjenih procedur (DPC, Deferred Procedure Call). DPC so sistemske funkcije, katerih izvedba ima nižjo prednost kot obravnava aparaturnih prekinitev in  lahko malo počaka. Tipična uporaba DPC je v gonilnikih aparaturnih naprav. Pri teh po vsaki aparaturni prekinitvi sistem v servisni rutini (ISR) samo shrani stanje naprave, vse ostalo pa opravi ustrezna DPC (tudi ta v sistemskem (kernel) načinu), ko bo računalnik za to našel čas.

Sistem DPC je predstavljen z DPC objektom, kateri vsebuje naslov sistemske funkcije, ki jo bo klical kernel, ko bo izvajal DPC prekinitev. DPC objekti shranjeni v vrsti in čakajo, da se bo zgodila DPC prekinitev. V vrsto najpogosteje nalagajo goniliniki naprav, ki se izvajajo z višjim IRQL-om procedure, ki se lahko izvedejo kasneje. Ko IRQL pade pod nivo DPC kernel sam sproži DPC prekinitev in zamaknjene procedure se začnejo izvajati v sistemskem načinu.

Interaktivni prikaz klicev DPC

 

Prekinitve za klice asinhronih procedur APC (asynchronous procedure call)

 
Podoben mehanizem so klici asinhronih procedur (APC, Asynchronous Procedure Call), ki jih lahko izvajamo bodisi v sistemskem, bodisi v uporabniškem režimu. V razliko od DPC se APC izvajajo v naslovnem prostoru določene uporabniške niti. Uporabljamo jih na primer za zaključek neke vhodno-izhodne operacije, ki jo je zahtevala neka aplikacija.

Sama koda tako ISR, kot DPC in APC je običajno del nekega gonilnika naprave (device driver), podatkovni del, ki je spravljen (vsaj za DPC in APC) v obliki ustreznega (DPC oziroma APC) objekta.

APC zagotavljajo izvedbo code v  kontekstu posamezne uporabniške niti. Prav tako so predstavljene z APC objektom in čakajo na izvršitev v APC vrsti. Za razliko od DPC, ki ima eno vrsto za cel sistem, ima vsaka nit svojo APC vrsto. Ko zaprosimo za uvrstitev APC procedure v vrsto, kernel sam uvrsti vrsto v nit, v kateri se bo izvajala. APC procedure lahko izvajamo v uporabniškem ali pa sistemskem načinu. Največkrat se uporabljajo, da se zapiše I/O informacija v pravo nit.


Programske prekinitve

 
Če je do programske prekinitve prišlo v sistemskem režimu (kernel mode), razvrščevalnik izjem (exception dispacher) enostavno pokliče ustrezno rutino. 

Če pa pride do izjeme v uporabniškem režimu, kliče ta razvrščevalnik ustrezna vrata (debugger port ali exception port). Tako so na primer realizirane prekinitvene točke (breakpoints) razhroščevalnikov.