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í neboli výjimky vyvolává sám procesor, pokud dojde k problému při zpracování strojových instrukcí, čímž umožňuje operačnímu systému na tyto situace reagovat. Jedná se například o pokus o dělení nulou, pokus o provedení neexistující instrukce, 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í
Na počítačích PC-kompatibilních s procesory x86 probíhá zpracování vnějšího přerušení takto:
- Vstupně-výstupní zařízení požadující přerušení aktivuje jednu ze vstupních linek IRQ (Interrupt request) řadiče přerušení.
- Pokud se jedná o kaskádovaný řadič přerušení (na obrázku chybně popsaný jako I/O rozhraní) předá signál z výstupu INTR na vstup IRQ primárního řadiče přerušení.
- Řadič přerušení vygeneruje signál INTR (Interrupt request) – „někdo“ žádá o přerušení, a vyšle ho k procesoru.
- Procesor dokončí právě prováděnou instrukci (nebo jednu iteraci iterované instrukce) a pokud není přerušení maskováno, vyšle signál INTA (Interrupt acknowledge).
- Podle toho, ze které IRQ linky přerušení přišlo, řadič přerušení sestaví instrukci přerušení, kterou procesor načte z řadiče a začne vykonávat.
- Procesor uloží stavové informace o právě zpracovávaném programu na zásobník.
- Podle čísla přerušení nalezne ve vektoru přerušení ve vnitřní paměti adresu příslušného obslužné rutiny přerušení a předá jí řízení.
- Přerušovací rutina uloží stav procesoru na zásobník, identifikuje detailně, jaké zařízení vyvolalo přerušení a provede vlastní obsluhu zařízení.
- Na konci obslužné rutiny je nutné obnovit stav procesoru ze zásobníku a instrukcí
IRET
se načtou stavové informace přerušeného programu ze zásobníku a vrátí řízení na přerušený program. - Pokračuje provádění přerušeného programu.
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í: dvoubajtovou int n
, která má jednobajtový operand udávající číslo přerušení, a jednobajtovou instrukci int03
určenou jako breakpoint pro debuggery.
První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í |
Média použitá na této stránce
Schéma přerušení - Animace procesu přerušení