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. |
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.
![]() |
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.