Přerušení
Přerušení (anglicky interrupt) je v informatice metoda pro asynchronní obsluhu událostí, kdy procesor přeruší vykonávání sledu instrukcí, vykoná obsluhu přerušení, a pak pokračuje v předchozí činnosti. Původně přerušení sloužilo k obsluze hardwarových zařízení, které tak signalizovaly potřebu obsloužit (tj. odebrat z vyrovnávací paměti vstupně-výstupního zařízení data nebo do ní další data nakopírovat, odtud označení vnější přerušení). Později byla přidána vnitřní přerušení, která vyvolává sám procesor, který tak oznamuje chyby vzniklé při provádění strojových instrukcí a synchronní softwarová přerušení vyvolávaná speciální strojovou instrukcí, která se obvykle používají pro vyvolání služeb operačního systému.
Obsluha přerušení
Přijde-li do procesoru signalizace přerušení, je v případě, že obsluha přerušení je povolena, nejprve dokončena právě rozpracovaná strojová instrukce. Pak je na zásobník uložena adresa následující strojové instrukce, která by měla být zpracována, kdyby k přerušení nedošlo. Pak je podle tabulky přerušení vyvolána obsluha přerušení, která obslouží událost, kterou přerušení vyvolalo. Obsluha přerušení je zodpovědná za to, aby na jeho konci byl uveden stav procesoru do stavu jako na jejím začátku, aby výpočet přerušené úlohy nebyl ovlivněn, což se z důvodu vyšší rychlosti obvykle dělá softwarově (některé procesory umožňují uložit svůj stav pomocí speciální strojové instrukce). Na konci obsluhy přerušení je umístěna instrukce návratu (RET, někdy speciální IRET), která vyzvedne ze zásobníku návratovou adresu a tak způsobí, že z této adresy bude vyzvednuta následující strojová instrukce. Přerušená úloha tak až na zpoždění nepozná, že proběhla obsluha přerušení.
Tabulka přerušení umožňuje, aby procesor mohl rozlišit více různých přerušení (rozlišených čísly), ke každému vyvolat odpovídající obsluhu přerušení (podprogram) a aby šlo jednotlivé obsluhy umístit na libovolná místa v paměti. Obsluha přerušení je obvykle uložena v ovladači, který spolu s novým hardwarovým zařízením do operačního systému instalujeme.
Typy přerušení
Vnější přerušení
Vnější přerušení (též hardwarové přerušení) je označováno podle toho, že přichází ze vstupně-výstupních zařízení (tj. z pohledu procesoru přicházejí z vnějšku). Vstupně-výstupní zařízení tak má možnost si asynchronně vyžádat pozornost procesoru a zajistit tak svoji obsluhu ve chvíli, kdy to právě potřebuje bez ohledu na právě zpracovávanou úlohu.
Vnější přerušení jsou do procesoru doručována prostřednictvím řadiče přerušení, což je specializovaný obvod, který umožňuje stanovit prioritu jednotlivým přerušením, rozdělovat je mezi různé procesory a další související akce.
Vnitřní přerušení
Vnitřní přerušení vyvolává sám procesor, který tak signalizuje problémy při zpracování strojových instrukcí a umožňuje operačnímu systému na tyto události nejvhodnějším způsobem zareagovat. Jedná se například o pokus dělení nulou, porušení ochrany paměti, nepřítomnost matematického koprocesoru, výpadek stránky a podobně.
Softwarové přerušení
Softwarové přerušení je speciální strojová instrukce (obvykle je jich v procesoru k dispozici několik, procesory Intel mapují všechna přerušení na softwarová přerušení). Tento typ přerušení je na rozdíl od druhých dvou typů synchronní, je tedy vyvoláno zcela záměrně umístěním příslušné strojové instrukce přímo do prováděného programu. Jedná se o podobný způsob, jako vyvolání klasickému podprogramu (podprogramem je zde ISR uvnitř operačního systému), avšak procesor se může zachovat jinak. Instrukce softwarového přerušení se proto využívá pro vyvolání služeb operačního systému z běžícího procesu (tzv. systémové volání). Uživatelská úloha tak sice nemůže skočit do prostoru jádra operačního systému, ale může k tomu využít softwarové přerušení (kterých je omezené množství a vstupní body lze snadno kontrolovat). Při využití privilegovaného režimu může softwarové přerušení aktivovat privilegovaný stav.
Popis implementace
Průběh hardwarového přerušení
- Vnější zařízení vyvolá požadavek o přerušení.
- I/O rozhraní vyšle signál IRQ na řadič přerušení (na port IRQ 2).
- Řadič přerušení vygeneruje signál INTR – „někdo“ žádá o přerušení a vyšle ho k procesoru.
- Procesor se na základě maskování rozhodne obsloužit přerušení a signálem INTA se zeptá, jaké zařízení žádá o přerušení.
- Řadič přerušení identifikuje zařízení, které žádá o přerušení a odešle číslo typu přerušení k procesoru.
- Procesor uloží stavové informace o právě zpracovávaném programu do zásobníku.
- Podle čísla typu příchozího přerušení nalezne ve vektoru přerušení adresu příslušného obslužného podprogramu.
- Vyhledá obslužný podprogram obsluhy přerušení v paměti a vykoná ho.
- Po provedení obslužného programu opět obnoví uložené stavové informace ze zásobníku a přerušený program pokračuje dál.
Průběh softwarového přerušení
- Při příchodu přerušení se uloží stavové informace o právě zpracovávaném programu do zásobníku.
- Zakáže se další přerušení.
- Procesor zjistí vektor přerušení (podle operandu).
- Nalezne obslužný podprogram a vykoná ho.
- Po návratu z podprogramu obnoví uložené stavové informace o přerušeném programu.
Softwarové přerušení v architektuře x86
Architektura x86 má dvě instrukce pro softwarové přerušení: int
a int03
, speciální jednobajtovou formu určenou jako breakpoint pro debuggery.
Dolních 32 přerušení je vyhrazeno pro výjimky, přerušení generovaná přímo procesorem. Ne všechny z nich se využívají, na 8086 jich existovalo jen prvních sedm, později (počínaje procesorem i386) přibyly další:
- dělení nulou
- krokovací přerušení – na i386 rozšířeno na víceúčelové ladicí přerušení
- NMI – externí nemaskovatelné přerušení
- breakpoint – vyvolaný již zmíněnou instrukcí
int03
- přetečení – je vyvolané instrukcí
into
, pokud je v příznacích zaznamenáno přetečení - překročení mezí – volané instrukcí
bound
, pokud byly překročeny meze pole (přidáno v 80186) - chybná instrukce
- nedostupnost koprocesoru – nepřítomnost nebo nepřepnutá úloha – dříve bylo hlášeno externím nemaskovatelným přerušením
- dvojitá chyba – vyvoláno, pokud dojde k výjimce při vyvolávání výjimky
- překročení limitu segmentu koprocesorem
- chybný TSS – chyba při pokusu o změnu úlohy
- nepřístupný segment
- překročení limitu zásobníku
- obecná chyba ochrany – většina chyb související se segmentací kromě těch obsloužených ostatními výjimkami
- výpadek stránky – pokus o přístup ke stránce, která je namapována, avšak není v operační paměti přítomna
- (nepoužito)
- chyba koprocesoru
- chyba zarovnání – pokus o přístup k adrese nedělitelné odpovídající mocninou dvou, pokud je zapnuta kontrola zarovnání
Přerušení u PC AT
U počítačů PC AT jsou standardně použita čísla vnějších přerušení takto:
IRQ 0 | Řadič systémového času |
IRQ 1 | Řadič klávesnice |
IRQ 2 | Připojení řadičů přerušení z I/O rozhraní (kaskáda)- zde jsou sjednoceny IRQ 8 až IRQ 15 |
IRQ 3 | Sériový port 2 |
IRQ 4 | Sériový port 1 |
IRQ 5 | Paralelní port 2 |
IRQ 6 | Řadič disket |
IRQ 8 | Hodiny reálného času |
IRQ 9 | Volný, podle připojeného zařízení |
IRQ 10 | Volný, podle připojeného zařízení |
IRQ 11 | Volný, podle připojeného zařízení |
IRQ 12 | Volný, podle připojeného zařízení |
IRQ 13 | Numerický koprocesor |
IRQ 14 | Řadič pevného disku |
IRQ 15 | Volný, podle připojeného zařízení |