Přerušení
Z Wikipedie, otevřené encyklopedie
Přerušení (anglicky interrupt) je v informatice nástroj pro asynchronní obsluhu událostí, kdy procesor přeruší vykonávání instrukcí a vykoná obsluhu přerušení. Původně přerušení sloužilo k obsluze hardwarových zařízení, později se přidala synchronní softwarová přerušení a vnitřní přerušení pro oznamování chyb procesorem vzniklých při provádění strojových instrukcí.
Obsah |
[editovat] Hardwarové (vnější) přerušení
Původně se tak označovalo IRQ, tedy hardwarové přerušení, které nastává jako reakce na signál od zařízení, které jím upozorňuje procesor (obvykle operační systém, přesněji svůj ovladač v tomto systému), že potřebuje obsloužit. Procesor při příchodu přerušení přestane provádět současný výpočet, uloží část svého stavu a začne vykonávat obsluhu přerušení. Takovýto typ přerušení (vyvolaný HW) je tzv. asynchronní, tedy může přijít v libovolném bodu výpočtu (nikoliv ovšem doslova libovolném: například nemůže přijít uprostřed instrukce, a to ani u moderních superskalárních procesorů, ve kterých se instrukce rozkládá na více interních instrukcí). Přerušení přichází bez ohledu na to, kolik je momentálně vykonávaných programů. Přerušení lze také v některých případech zakázat maskováním – k obsluze přerušení dojde až po opětovném povolení přerušení.
[editovat] Softwarové přerušení
Obecnějším termínem se to stalo při zavedení softwarových přerušení, tedy přerušení vyvolávaných přímo uvnitř procesoru a využívající stejnou nebo podobnou metodu předání řízení z probíhajícího výpočtu do obsluhy přerušení. Softwarové přerušení může být vyvoláno buď speciální instrukcí (přerušení se používá jako způsob volání operačního systému z aplikace), nebo výjimečným stavem výpočtu, neboli výjimkou (dělení nulou, přístup k neexistující adrese). Softwarová přerušení jsou vždy tzv. synchronní. Pokud příjde více přerušení, musí systém vyhodnotit, v jakém pořadí se budou provádět.
[editovat] Obsluha přerušení
[editovat] ISR – Interrupt Service Routine
ISR je obslužný podprogram pro vykonání obsluhy daného přerušení a je obvykle součástí ovladače zařízení, které přerušení vyvolalo. ISR musí nejprve uložit stavové informace CPU na zásobník (FR a PC). Poté provede obsluhu přerušení a nakonec obnoví ze zásobníku stav CPU a přerušená činnost pokračuje v místě kde byla při příchodu přerušení vykonávaná instrukce pozastavena. Přerušený program v podstatě nic nepozná – až na malé zpoždění.
[editovat] 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.
[editovat] 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.
[editovat] Softwarové přerušení v architektuře x86
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:
- dělení nulou
- krokovací přerušení - na i386 rozšířeno na víceúčelové debugovací přerušení
- NMI
- breakpoint - vyvolaný již zmíněnou instrukcí int03
- přetečení - je vyvolané instrukcí
intopokud je ve vlajkách zaznamenáno přetečení - překročení mezí - volané instrukcí bound pokud byly překročeny meze pole, přidané v 80186
- chybná instrukce
U procesoru i386 přibylo 9 dalších:
- nedostupnost koprocesoru - nepřítomnost nebo nepřepnutá úloha - dřív bylo hlášeno externím hardwarovým přerušením
- dvojitý výpadek - volané pokud dojde k vyjímce 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 - obecně libovolná chyba při stránkování
- (nepoužito)
- chyba koprocesoru
[editovat] Standardní využití linek u PC AT
| IRQ 0 | Řadič systémového času |
| IRQ 1 | Řadič klávesnice |
| IRQ 2 | Připojení řadičů přerušení z I/O rozhnaní (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í |


