Obsluha přerušení - Interrupt handler

V programování počítačových systémů je obsluha přerušení , známá také jako rutina služby přerušení nebo ISR , speciální blok kódu přidružený ke konkrétní podmínce přerušení . Obslužné rutiny přerušení jsou iniciovány hardwarovými přerušeními, pokyny k přerušení softwaru nebo softwarovými výjimkami a používají se k implementaci ovladačů zařízení nebo přechodů mezi chráněnými režimy provozu, jako jsou například systémová volání .

Tradiční forma obsluhy přerušení je obsluha přerušení hardwaru. Hardwarová přerušení vyplývají z elektrických podmínek nebo nízkoúrovňových protokolů implementovaných v digitální logice , jsou obvykle odesílány prostřednictvím pevně zakódované tabulky vektorů přerušení, asynchronně do normálního prováděcího proudu (jak to úrovně maskování přerušení umožňují), často s použitím samostatného zásobníku a automatické zadávání do jiného kontextu spouštění (úroveň oprávnění) po dobu provádění obsluhy přerušení. Obecně platí, že hardwarová přerušení a jejich obslužné rutiny se používají ke zpracování podmínek s vysokou prioritou, které vyžadují přerušení aktuálního kódu, který procesor provádí.

Později se ukázalo jako vhodné, aby software mohl spouštět stejný mechanismus pomocí softwarového přerušení (forma synchronního přerušení). Spíše než pomocí pevně zakódované expediční tabulky přerušení na hardwarové úrovni jsou softwarová přerušení často implementována na úrovni operačního systému jako forma funkce zpětného volání .

Obslužné rutiny přerušení mají mnoho funkcí, které se liší podle toho, co přerušení vyvolalo, a podle rychlosti, s níž obsluha přerušení dokončí svůj úkol. Například stisknutím klávesy na klávesnici počítače nebo pohybem myši se spustí přerušení, která vyvolávají obsluhy přerušení, které čtou klíč nebo polohu myši, a zkopírují související informace do paměti počítače.

Obslužná rutina přerušení je nízkoúrovňovým protějškem obslužných rutin událostí . Obsluhy přerušení však mají neobvyklý kontext provádění, mnoho drsných omezení v čase a prostoru a jejich bytostně asynchronní povaha je znatelně obtížně ladí standardními postupy (reprodukovatelné testovací případy obecně neexistují), což vyžaduje specializovanou sadu dovedností - důležitá podmnožina programování systému - softwarových inženýrů, kteří se zabývají vrstvou přerušení hardwaru.

Přerušit vlajky

Na rozdíl od jiných obslužných rutin událostí se od obsluh přerušení očekává, že v rámci své základní funkce nastaví příznaky přerušení na příslušné hodnoty.

Dokonce i v CPU, který podporuje vnořená přerušení, je obsluha často dosažena se všemi přerušeními globálně maskovanými hardwarovou operací CPU. V této architektuře by obsluha přerušení obvykle uložila nejmenší množství nezbytného kontextu a poté by při první příležitosti resetovala příznak deaktivace globálního přerušení, aby přerušení s vyšší prioritou umožnilo přerušení aktuálního obslužného programu. Je také důležité, aby obsluha přerušení nějakým způsobem potlačila aktuální zdroj přerušení (často přepínání příznakového bitu nějakého druhu v periferním registru), aby se aktuální přerušení okamžitě neopakovalo při výstupu obsluhy, což mělo za následek nekonečnou smyčku .

Ukončení obsluhy přerušení se systémem přerušení ve správném stavu za každé situace může být někdy náročný a náročný úkol a jeho nesprávné zacházení je zdrojem mnoha závažných chyb, druhu, který systém zcela zastaví. Tyto chyby jsou někdy občasné, přičemž k nesprávnému zacházení s hranami nedochází týdny nebo měsíce nepřetržitého provozu. Formální ověření obsluh přerušení je nesmírně obtížné, zatímco testování obvykle identifikuje pouze nejčastější režimy selhání, takže jemné, občasné chyby v obsluhách přerušení se často dodávají koncovým zákazníkům.

Kontext provádění

V moderním operačním systému je kontext spuštění obsluhy hardwarového přerušení jemný.

Z důvodů výkonu bude obsluha obvykle spuštěna v kontextu paměti a provádění spuštěného procesu, ke kterému nemá žádné zvláštní spojení (přerušení v podstatě uzurpuje běžící kontext - účtování času procesu často přičte čas strávený zpracováním přerušení na přerušený proces). Na rozdíl od přerušeného procesu je však přerušení obvykle zvýšeno pevně zakódovaným mechanismem CPU na úroveň oprávnění dostatečně vysokou pro přímý přístup k hardwarovým prostředkům.

Úvahy o prostoru zásobníku

V nízkoúrovňovém mikrokontroléru může čipu chybět režimy ochrany a nemusí mít jednotku pro správu paměti (MMU). V těchto čipech bude kontext provádění obsluhy přerušení v zásadě stejný jako přerušený program, který obvykle běží na malém zásobníku pevné velikosti (paměťové prostředky byly tradičně extrémně omezené na dolním konci). Vnořená přerušení jsou často poskytována, což zhoršuje využití zásobníku. Primárním omezením obsluhy přerušení v tomto programovacím úsilí je nepřekročit dostupný zásobník v nejhorším případě, což vyžaduje, aby programátor globálně uvažoval o požadavku na prostor zásobníku každého implementovaného obslužného programu přerušení a úlohy aplikace.

Při překročení přiděleného prostoru zásobníku (podmínka známá jako přetečení zásobníku ) to čipy této třídy běžně v hardwaru nezjistí. Pokud je zásobník překročen do jiné oblasti zapisovatelné paměti, obslužný program bude obvykle fungovat podle očekávání, ale aplikace později (někdy mnohem později) selže kvůli vedlejšímu účinku obsluhy na poškození paměti. Pokud je zásobník překročen do oblasti paměti, která není zapisovatelná (nebo chráněná), k selhání obvykle dojde v samotném obslužném programu (obecně snazší případ pro pozdější ladění).

V zapisovatelném případě lze implementovat strážný strážný zásobník - pevnou hodnotu těsně za koncem legálního zásobníku, jehož hodnotu lze přepsat, ale nikdy nebude, pokud systém funguje správně. Je běžné pravidelně pozorovat poškození ochranného krytu pomocí nějakého mechanismu hlídacího psa. Tím se zachytí většina podmínek přetečení zásobníku v časovém bodě poblíž operace, která se provinila.

Ve víceúlohovém systému bude mít každé vlákno provádění obvykle svůj vlastní zásobník. Pokud pro přerušení není k dispozici žádný speciální systémový zásobník, přerušení zaberou místo v zásobníku z jakéhokoli vlákna provádění, které je přerušeno. Tyto návrhy obvykle obsahují MMU a uživatelské zásobníky jsou obvykle konfigurovány tak, že přetečení zásobníku je zachyceno MMU, a to buď jako systémová chyba (pro ladění), nebo pro přemapování paměti, aby se rozšířil dostupný prostor. Prostředky paměti na této úrovni mikrokontroléru jsou obvykle mnohem méně omezené, takže zásobníky lze přidělovat s velkorysým bezpečnostním rozpětím.

V systémech podporujících vysoký počet vláken je lepší, když mechanismus přerušení hardwaru přepne zásobník na speciální systémový zásobník, aby žádný ze zásobníků vláken nemusel zohledňovat použití vnořeného přerušení v nejhorším případě. Drobné procesory již od 8bitové Motoroly 6809 z roku 1978 poskytovaly oddělené ukazatele systémového a uživatelského zásobníku.

Omezení v čase a souběžnosti

Z mnoha důvodů je velmi žádoucí, aby se obsluha přerušení prováděla co nejkratší dobu, a je velmi nedoporučeno (nebo zakázáno), aby přerušení hardwaru vyvolávalo potenciálně blokující systémová volání. V systému s více exekučními jádry jsou úvahy o reentranci také prvořadé. Pokud systém poskytuje hardwarovou DMA , mohou problémy se souběžností nastat dokonce i s jediným jádrem CPU. (Není neobvyklé, že mikrokontrolér střední úrovně postrádá úroveň ochrany a MMU, ale přesto poskytuje modul DMA s mnoha kanály; v tomto scénáři je mnoho přerušení obvykle spuštěno samotným modulem DMA a související obsluha přerušení je očekává se opatrné našlapování.)

Vyvinula se moderní praxe, která rozděluje obsluhy přerušení hardwaru na prvky přední poloviny a zadní poloviny. Přední polovina (nebo první úroveň) obdrží počáteční přerušení v kontextu běžícího procesu, provede minimální práci na obnovení hardwaru do méně naléhavého stavu (například vyprázdnění vyrovnávací paměti pro plný příjem) a poté označí zadní polovinu (nebo druhá úroveň) pro provedení v blízké budoucnosti s příslušnou prioritou plánování; jakmile je vyvolána, back-half pracuje ve svém vlastním kontextu procesu s méně omezeními a dokončí logickou operaci obsluhy (jako je například přenos nově přijatých dat do datové fronty operačního systému).

Rozdělené popisovače v moderních operačních systémech

V několika operačních systémů, Linux , Unix , MacOS , Microsoft Windows , z / OS , DESQview a některé jiné operační systémy používané v minulých-přerušení manipulátory jsou rozděleny do dvou částí: Interrupt Handler First-Level ( FLIH ) a Second -Úrovně přerušení Handlers ( SLIH ). FLIH jsou také známé jako obsluhy tvrdých přerušení nebo rychlé obsluhy přerušení a SLIH jsou také známé jako obsluhy pomalého/měkkého přerušení nebo Odložená volání procedur ve Windows.

FLIH implementuje při minimálním zpracování přerušení specifické pro platformu podobné rutinám přerušení . V reakci na přerušení existuje kontextový přepínač a kód pro přerušení se načte a spustí. Úkolem FLIH je rychle opravit přerušení nebo zaznamenat kritické informace specifické pro platformu, které jsou k dispozici pouze v době přerušení, a naplánovat spuštění SLIH pro další dlouhodobé zpracování přerušení.

FLIH způsobují chvění při provádění procesu. FLIH také maskují přerušení. Snížení chvění je nejdůležitější pro operační systémy v reálném čase , protože musí zachovat záruku, že spuštění konkrétního kódu bude dokončeno v dohodnutém čase. Aby se snížilo jitter a snížil se potenciál ztráty dat z maskovaných přerušení, pokoušejí se programátoři minimalizovat dobu provádění FLIH, pohybující se co nejvíce do SLIH. S rychlostí moderních počítačů mohou FLIH implementovat všechny manipulace závislé na zařízení a platformě a používat SLIH pro další dlouhodobé zpracování nezávislé na platformě.

FLIH, které obsluhují hardware, obvykle maskují jejich přidružené přerušení (nebo je případně ponechají maskované), dokud nedokončí jejich provádění. (Neobvyklý) FLIH, který odmaskuje přidružené přerušení, než se dokončí, se nazývá obsluha přerušení reentrantu . Obslužné rutiny přerušení reentrantu mohou způsobit přetečení zásobníku z více předvoleb stejným vektorem přerušení , a proto se jim obvykle vyhýbají. V systému prioritního přerušení FLIH také (krátce) maskuje další přerušení se stejnou nebo nižší prioritou.

SLIH dokončí úlohy zpracování dlouhého přerušení podobně jako proces. SLIH mají buď vyhrazené vlákno jádra pro každý obslužný program, nebo je spouští fond pracovních vláken jádra. Tato vlákna sedí ve frontě běhů v operačním systému, dokud jim není k dispozici čas procesoru k provedení zpracování pro přerušení. SLIH mohou mít dlouhou dobu provádění, a proto jsou obvykle naplánovány podobně jako vlákna a procesy.

V Linuxu se FLIH nazývají horní polovina a SLIH se nazývají dolní polovina nebo spodní polovina . To se liší od pojmenování používaného v jiných unixových systémech, kde oba jsou součástí spodní poloviny .

Viz také

Reference