Przerwanie - po angielsku Interrupt (lub Interrupt Request, w skrócie IRQ) to sygnał powodujący przerwanie wykonywania aktualnego kodu. Pojawienie się przerwania powoduje wstrzymanie aktualnie wykonywanego programu i wykonanie przez procesor kodu procedury obsługi przerwania (ang. interrupt handler). Każde przerwanie ma swój unikalny numer. Zwykle numer przerwania podaje się w postaci heksadecymalnej. IRQ od 0 (0x00) do 15(0x0F) są zarezerwowane dla przerwań sprzętowych, wyższe numery przeznaczone są dla tzw. przerwań programowych.
1. Sprzętowe
Przerwania sprzętowe są to, zgodnie z nazwą, przerwania wywoływane na poziomie sprzętu. Istnieją dwa rodzaje przerwań sprzętowych:
a) Zewnętrzne, gdy sygnał przerwania pochodzi z zewnętrznego układu obsługującego przerwania sprzętowe. Służą one do komunikacji z urządzeniami zewnętrznymi, np. z klawiaturą, napędami dysków itp.
b) Wewnętrzne, częściej nazywane po prostu wyjątkami. Są wywoływane przez procesor po napotkaniu błędu (wyjątku), np. dzielenie przez zero. W tej kategorii można wyróżnić trzy rodzaje: faults (niepowodzenia) - gdy dana instrukcja wywoła błąd, który da się naprawić i można powrócić do dalszego wykonywania, traps (pułapki) - gdy nie wystąpił błąd, a jedynie wcześniej zaplanowane wykonanie przerwania (stosowane często przy debuggowaniu aplikacji) oraz aborts, czyli błędy, których nie można naprawić.
2. Programowe
Przerwania programowe wywoływane są na poziomie oprogramowania przez aktualnie wykonywany program. Aby można było wywołać przerwanie programowe, wcześniej pewien program powinien je zainstalować - umieścić w pamięci procedurę obsługi przerwania oraz umieścić wskaźnik do niej w wektorze przerwań (spisie wszystkich procedur obsługi przerwań). Przerwania programowe umożliwiają stworzenie niskopoziomowych procedur, które mogą być uruchomione przez wszystkie uruchamiane aplikacji w dowolnym momencie. Najczęściej wykorzystywane są do komunikacji z systemem operacyjnym, poprzez tzw. system calls (wywołania systemowe).
1. W trybie rzeczywistym
W trybie rzeczywistym pracy procesora adres procedury obsługi przerwania jest zapisany w tablicy wektorów przerwań. Tablica wektorów przerwań przechowuje adresy poszczególnych procedur obsługi przerwań; przerwania identyfikowane są przez numer (wektor przerwania) i w przypadku procesorów serii x86 jest możliwych do 256 przerwań.
Tablica wektorów przerwań znajduje się w pierwszych 1024 (256 czterobajtowych adresów procedur obsługi przerwań) komórkach pamięci operacyjnej.
W komputerach PC jest zazwyczaj 16(jednak tylko 15 jest wykorzystywanych przez sprzęt - wynika to z kaskadowego połączenia dwóch kontrolerów przerwań, połączenie to zajmuje jeden sygnał) różnych sygnałów IRQ (ang. interrupt request) - IRQ0 do IRQ15. Często mówiąc o IRQ ma się na myśli sam numer przerwania, jako zasób udostępniany przez procesor. Jako, że jest ich tylko 16, bywają problemy z przydzieleniem osobnego przerwania każdemu z urządzeń, które go potrzebuje, może to powodować przydzielenie tego samego przerwania dwóm urządzeniom. Mówi się wtedy o konflikcie przerwań, gdyż najczęściej dwa urządzenia nie mogą współdzielić jednego.
2. W trybie chronionym
W trybie chronionym pracy procesora x86 mamy do czynienia z tablicą deskryptorów przerwań (ang. Interrupt Descriptor Table, IDT) łączącą każdy wektor wyjątku lub przerwania z deskryptorem bramy (deskryptory bram to deskryptory pozwalające na kontrolowany dostęp do segmentów kodu o różnych stopniach uprzywilejowana) dla procedury lub zadania (ang. task) obsługującym dany wyjątek lub przerwanie. Położenie IDT jest zapisane w rejestrze tablicy deskryptorów przerwań (ang. Interrupt Descriptor Table Register, IDTR). IDT zawiera do 256 wpisów zwanych deskryptorami. Rozmiar IDT to 256*8B (8 Bajtów to rozmiar pojedynczego deskryptora); w przypadku mniejszej ilości deskryptorów (obsługiwanych przerwań) niż maksymalne 256, puste sloty (czyli w rzeczywistości nieważne deskryptory) powinny zawierać flagę dostępności segmentu (ang. Segment Present Flag, P) ustawiona na 0 (zobacz budowa deskryptora). IDT może zawierać trzy różne rodzaje deskryptorów bram:
a) deskryptor bramy zadania (ang. Task-Gate Descriptor) - deskryptor używany przy sprzętowej wielozadaniowości, wskazuje położenie w pamięci struktury opisującej zadanie
b) deskryptor bramy przerwania (ang. Interrupt-Gate Descriptor) - informujący procesor o kodzie któy ma wykonać po napotkaniu przerwania
c) deskryptor bramy pułapki (ang. Trap-Gate Descriptor) - zawierający lokalizację w kodzie, które gdy zostanie zostanie osiągnięte wywoła przerwanie - pułapkę (użyteczne przy debuggowaniu)
W celu wywołania przerwania o danym numerze należy wywołać operację:
INT numer_przerwania
[1] Ralf Brown's Interrupt List - Wersja do przeglądania on-lina
[2] IntelR 64 and IA-32 Architectures Software Developer's Manuals