Přerušení

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

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 | editovat zdroj]

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 | editovat zdroj]

Vnější přerušení[editovat | editovat zdroj]

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 | editovat zdroj]

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í[editovat | editovat zdroj]

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 | editovat zdroj]

Průběh hardwarového přerušení[editovat | editovat zdroj]

  1. Vnější zařízení vyvolá požadavek o přerušení
  2. I/O rozhraní vyšle signál IRQ na řadič přerušení (na port IRQ 2)
  3. Řadič přerušení vygeneruje signál INTR – „někdo“ žádá o přerušení a vyšle ho k procesoru.
  4. 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í.
  5. Řadič přerušení identifikuje zařízení, které žádá o přerušení a odešle číslo typu přerušení k procesoru
  6. Procesor uloží stavové informace o právě zpracovávaném programu do zásobníku.
  7. Podle čísla typu příchozího přerušení nalezne ve vektoru přerušení adresu příslušného obslužného podprogramu.
  8. Vyhledá obslužný podprogram obsluhy přerušení v paměti a vykoná ho.
  9. 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.
Schéma obsluhy hardwarového přerušení

Průběh softwarového přerušení[editovat | editovat zdroj]

  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 | editovat zdroj]

Architektura x86 má dvě instrukce pro softwarové přerušení: int a int03, speciální krátkou formu určenou jako breakpoint pro debuggery.

Má šest výjimek:

  1. dělení nulou
  2. krokovací přerušení - na i386 rozšířeno na víceúčelové debugovací přerušení
  3. NMI
  4. breakpoint - vyvolaný již zmíněnou instrukcí int03
  5. přetečení - je vyvolané instrukcí into pokud je ve vlajkách zaznamenáno přetečení
  6. překročení mezí - volané instrukcí bound pokud byly překročeny meze pole, přidané v 80186
  7. chybná instrukce

U procesoru i386 přibylo 9 dalších:

  1. nedostupnost koprocesoru - nepřítomnost nebo nepřepnutá úloha - dřív bylo hlášeno externím hardwarovým přerušením
  2. dvojitý výpadek - volané pokud dojde k výjimce při vyvolávání výjimky
  3. překročení limitu segmentu koprocesorem
  4. chybný TSS - chyba při pokusu o změnu úlohy
  5. nepřístupný segment
  6. překročení limitu zásobníku
  7. obecná chyba ochrany - většina chyb související se segmentací kromě těch obsloužených ostatními výjimkami
  8. 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
  9. (nepoužito)
  10. chyba koprocesoru

Přerušení u PC AT[editovat | editovat zdroj]

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í