Prekinitve in njihova obravnava



Spoznali bomo, kako jedro LINUX obravnava prekinitve. Večina te obravnave je odvisna od tipa računalnika.
 
Večina modernih mikroprocesorjev obravnava prekinitve na enak način. Ko pride do prekinitve, CPE prekine izvajanje inštrukcij in nadaljuje potek na določeni pomnilniški lokaciji, kjer se nahaja rutina ali vsaj inštrukcija za skok na rutino za obravnavo prekinitve. To rutino normalno izvaja v posebnem režimu ( interrupt mode), ki onemogoča obravnavo dodatnih prekinitev. Bolj točno: upoštevajo se le prekinitve na višjih nivojih.

Ko je bila prekinitev obdelana, CPE restavrira stanje in nadaljuje prej prekinjen program.

Inicializacija podatkovnih struktur za obravnavo prekinitev

Strukture za obravnavo prekinitev, ki se nahajajo v jedru, vzpostavljajo gonilniki naprav, ko zahtevajo nadzor sistemskih prekinitev. Pri tem uporabljajo več rutin jedra. Tako posamezni gonilniki kličejo take rutine zato, da registrirajo naslove svojih rutin za obravnavo prekinitev.

Pri prekinitvah, ki so določene že z arhitekturo računalnika, zasede gonilnik  že ob svoji inicializaciji. Tako na primer gonilnik za gibki disk vedno zahteva  IRQ 6. V nekaterih primerih pa gonilnik ne ve, katero prekinitev lahko uporabi (tak problem zasledimo pri gonilnikih naprav ISA). V teh primerih Linux dovoli gonilnikom, da sami preskusijo prekinitve.

Gonilnik mora najprej vzpodbuditi napravo, da povzroči prekinitev. Nato omogočimo vse nerazporejene prekinitve. Linux prebere statusni register prekinitev ( interrupt status register) in vrne njegovo vsebino gonilniku. če je prišlo do vsaj ene prekinitve, je ta vsebina različna od 0.  Tako lahko ugotovimo primerno število IRQ. Gonilnik nato le še ponovno onemogoči nerazporejene (nepovzročene) prekinitve.

Naprave  PCI  lahko souporabljajo prekinitve. Linux to podpira tako, da prvemu (gonilniku), ki zahteva neko prekinitev, dovoli, da določi, ali lahko to prekinitev uporabljajo tudi drugi gonilniki.  Souporaba prekinitev  pomeni več struktur  irqaction , ki jih naslavlja en vhod v vektorju irq_action vector. Ko pride do prekinitve, pokliče Linux vse gonilnike. Ti morajo predvideti tudi klic, ko prekinitve ne pričakujejo.

Obravnava prekinitev

 
Linux mora preusmeriti prekinitve na pravo rutino.  Linux uporablja množico kazalcev na strukture z naslovi takih rutin. Te rutina pa pripadajo posameznim gonilnikom. 

Slika prikazuje vektor kazalcev   irq_action , ki kažejo na strukture  irqaction. Vsaka struktura  irqaction vsebuje podatke o rokovalniku (handler), vključno z naslovom prekinitvene servisne rutine. 

Gonilnik naprave mora ob prekinitvi prebrati statusni register naprave in ugotoviti vzrok prekinitve (morda je prišlo le do kakšne napake  ipd). Ko ugotovimo pravi vzrok, je morda potrebna še nadaljna obdelava, ki pa jo lahko prestavimo na poznejši čas in tako preprečimo pretirano zadrževanje CPE v prekinitvenem režimu.