Přerušení

signál procesoru

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í

editovat

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.

Související informace naleznete také v článku Obsluha přerušení.

Typy přerušení

editovat

Vnější přerušení

editovat

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.

Související informace naleznete také v článku Řadič přerušení.

Vnitřní přerušení

editovat

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í

editovat

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

editovat

Průběh hardwarového přerušení

editovat

Na počítačích PC-kompatibilních s procesory x86 probíhá zpracování vnějšího přerušení takto:

  1. 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í.
  2. 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í.
  3. Řadič přerušení vygeneruje signál INTR (Interrupt request) – „někdo“ žádá o přerušení, a vyšle ho k procesoru.
  4. 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).
  5. 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.
  6. Procesor uloží stavové informace o právě zpracovávaném programu na zásobník.
  7. 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í.
  8. 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í.
  9. 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.
  10. Pokračuje provádění přerušeného programu.
 
Schéma obsluhy hardwarového přerušení

Průběh softwarového přerušení

editovat
  1. Při příchodu přerušení se uloží stavové informace o právě zpracovávaném programu do zásobníku.
  2. Zakáže se další přerušení.
  3. Procesor zjistí vektor přerušení (podle operandu).
  4. Nalezne obslužný podprogram a vykoná ho.
  5. Po návratu z podprogramu obnoví uložené stavové informace o přerušeném programu.

Softwarové přerušení v architektuře x86

editovat

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ší:

  1. dělení nulou
  2. krokovací přerušení – na i386 rozšířeno na víceúčelové ladicí přerušení
  3. NMI – externí nemaskovatelné přerušení
  4. breakpoint – vyvolaný již zmíněnou instrukcí int03
  5. přetečení – je vyvolané instrukcí into, pokud je v příznacích zaznamenáno přetečení
  6. překročení mezí – volané instrukcí bound, pokud byly překročeny meze pole (přidáno v 80186)
  7. chybná instrukce
  8. nedostupnost koprocesoru – nepřítomnost nebo nepřepnutá úloha – dříve bylo hlášeno externím nemaskovatelným přerušením
  9. dvojitá chyba – vyvoláno, pokud dojde k výjimce při vyvolávání výjimky
  10. překročení limitu segmentu koprocesorem
  11. chybný TSS – chyba při pokusu o změnu úlohy
  12. nepřístupný segment
  13. překročení limitu zásobníku
  14. obecná chyba ochrany – většina chyb související se segmentací kromě těch obsloužených ostatními výjimkami
  15. 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
  16. (nepoužito)
  17. chyba koprocesoru
  18. 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

editovat

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í