Remove ads
sygnał powodujący zmianę przepływu sterowania, niezależnie od aktualnie wykonywanego programu Z Wikipedii, wolnej encyklopedii
Przerwanie, żądanie przerwania – sygnał powodujący zmianę przepływu sterowania, niezależnie od aktualnie wykonywanego programu. Pojawienie się przerwania powoduje wstrzymanie aktualnie wykonywanego programu i wykonanie przez procesor kodu procedury obsługi przerwania. Procedura ta wykonuje czynności związane z obsługą przerwania i na końcu wydaje instrukcję powrotu z przerwania, która powoduje powrót do programu realizowanego przed przerwaniem.
Przerwania dzielą się na dwie grupy:
Producenci procesorów część pozycji w tablicy wektorów przerwań rezerwują dla przerwań wewnętrznych. Pozostałe numery przerwań mogą być dowolnie wykorzystane przez producentów systemów komputerowych i oprogramowania. Obsługiwanie większości przerwań (wszystkich lub wybranych numerów) można wstrzymać lub zablokować, wyjątkiem są przerwania niemaskowalne.
Przerwanie polega na tym, że urządzenie wymagające obsługi procesora, na przykład urządzenie wejścia-wyjścia (klawiatura), moduł DMA, posiada specjalne połączenie (pojedynczy przewód) łączące niniejsze urządzenie z procesorem. Linia ta nosi nazwę linii przerwania. W momencie, kiedy urządzenie chce być obsługiwane przez procesor, wystawia umówiony sygnał na linii przerwania − z reguły jest to stan wysoki (wyzwalanie poziomem sygnału) lub też zmiana stanu z 0 na 1 (wyzwalanie zboczem).
Przykładem może być moduł klawiatury, który w momencie, kiedy zostanie naciśnięty klawisz, wystawia przerwanie. Sygnał ten (żądanie przerwania) zostanie odebrany przez procesor, w wyniku czego przejdzie on do procedury obsługi przerwania. W procedurze tej procesor odczyta, jaki klawisz został naciśnięty, przez odczyt odpowiednich rejestrów kontrolnych klawiatury, oraz wykona dodatkowe czynności − np. wyświetlenie tego klawisza na ekranie. W wyniku odczytu rejestrów kontrolnych (lub innego umówionego wpisu do tych rejestrów) klawiatura wyłącza sygnał przerwania − ustawia na linii przerwania stan nieaktywny; z reguły jest to stan niski. Dzięki temu procesor może zareagować na naciśnięcie następnego klawisza i obsłużyć kolejne przerwanie. Ostatnią instrukcją w procedurze obsługi przerwania jest specjalny rozkaz procesora reti (ang. return from interrupt), który pozwala mu wrócić do poprzednich czynności, tuż przed wystąpieniem przerwania.
Obsługa przerwania jest bardzo podobna do zwykłego skoku do podprogramu, podczas którego to procesor składa na stosie aktualny stan rejestru licznika programu, a następnie wykonuje skok do podprogramu. Po jego zakończeniu procesor powraca do programu głównego, poprzez załadowanie licznika programu wartością, która została uprzednio złożona na stosie. Podstawowa różnica polega na tym, że przerwania sprzętowe są asynchroniczne względem wykonywanego programu i mogą występować w dowolnej chwili − czyli wtedy, gdy niezależne urządzenie wystawi sygnał przerwania. Podobieństwa obsługi przerwań i skoku do podprogramu są na tyle duże, że niektórzy wykorzystują przerwania programowe jako sposób skoku do podprogramu.
Zwykle procesor musi obsługiwać wiele urządzeń, czyli posiadać wiele linii przerwań. Każda linia ma w takim wypadku swój unikalny numer (identyfikator) i procedurę przerwania. W większości systemów identyfikator jest to niewielka liczba będąca przesunięciem (offsetem) w specjalnej strukturze zwanej tablicą wektorów przerwań. W tablicy tej znajdują się adresy procedur lub też instrukcje skoku do procedur obsługi poszczególnych przerwań. I tak wystąpienie przerwania nr 5 powoduje skok do procedury obsługi, której adres znajduje się na piątej pozycji tejże tablicy. W ten sposób obsługa przerwania nie wymaga wyszukiwania odpowiedniej procedury, a jedynie odczytania jednego wektora przerwania. W procesorze Intel o architekturze IA-32 tablica wektorów przerwań ma 256 pozycji. Pierwsze 32 pozycje odpowiadają przerwaniom niemaskowalnym, natomiast pozostałe są przerwaniami maskowalnymi.
Wśród przerwań niektóre są ważniejsze od innych. Obsługa tych ważniejszych nie powinna być przerywana przez te mniej ważne. Nie będziemy przecież obsługiwać przerwań z klawiatury w czasie obsługi przerwania spadku zasilania w sieci, gdy system operacyjny musi szybko zamrozić i zapisać stan wszystkich obliczeń dopóki UPS jeszcze utrzymuje przez pewien czas napięcie. Wyróżnia się więc zwykle dwie grupy przerwań: maskowalne i niemaskowalne. Odbieranie przerwań maskowalnych może być chwilowo wyłączone (procesor je wtedy ignoruje albo odkłada na później). Odbierania przerwań niemaskowalnych nie można wyłączyć. Sterowniki urządzeń korzystają z przerwań maskowalnych. Przerwania niemaskowalne wiążą się z poważniejszymi zdarzeniami, takimi jak nieusuwalne błędy pamięci.
W niektórych systemach jest tak dużo obsługiwanych urządzeń, że procesorowi brakuje wyprowadzeń linii przerwań. W takim wypadku stosuje się specjalne urządzenie - kontroler przerwań (np. APIC, Intel 8259 itp.), który pośredniczy pomiędzy procesorem a wieloma urządzeniami żądającymi przerwania. Kontroler przerwań ma kilka linii wejściowych, podłączonych do wyjść przerwań poszczególnych urządzeń, i jedną wyjściową, za pośrednictwem której przekazuje sygnał przerwania do procesora. Najprostsza sprzętowa realizacja takiego kontrolera to zwykła bramka OR, która wystawia sygnał przerwania do procesora w momencie, kiedy dowolne urządzenie wystawiło taki sygnał. Rzeczywisty kontroler przerwań ma możliwość maskowania wybranych urządzeń (pochodzących od nich przerwań), nadawania priorytetów poszczególnym urządzeniom, itd. Kontroler przerwań posiada odpowiedni sterownik - procedurę obsługi przerwania (ang. interrupt handler). W procedurze tej z reguły odczytywany jest rejestr kontrolny kontrolera przerwań i to pozwala na stwierdzenie, które urządzenie wystawiło przerwanie. Na podstawie tego sterownik kontrolera przerwań uruchamia podprogram obsługujący urządzenie (ang. device handler), które wystawiło to żądanie przerwania. Kontroler przerwań zyskał tak dużą popularność, że większość procesorów posiada już tylko jedną linię przerwania - czyli może obsługiwać tylko jedno urządzenie zewnętrzne, którym z reguły jest właśnie kontroler przerwań.
Procedura obsługi przerwania musi być wykonana dość szybko ze względu na blokowanie obsługi innych przerwań. Pewne czasochłonne zadania, związane z przetwarzaniem danych w ramach operacji wejścia-wyjścia, mogą być wykonane później, poza obsługą przerwania. Określa się je jako czynności odroczone, a w systemie Linux nazywa dolną połową, podczas gdy górna połowa oznacza część kodu wykonywaną bezpośrednio w reakcji na przerwanie. Przykładem czynności odroczonych jest interpretacja zawartości ramki odebranej przez kartę sieciową. Zawartość bufora karty musi być skopiowana możliwie szybko, a dalsze przetwarzanie, np. sprawdzenie poprawności, interpretacja adresów itp., mogą być wykonane nieco później.
Przerwania wielokrotne są zjawiskiem naturalnym w przypadku jednoczesnej obsługi wielu urządzeń. Przykładem wystąpienia przerwań wielokrotnych jest odbiór danych z łącza komunikacyjnego w czasie obsługi drukarki.
Ogólnie można wyróżnić kilka podejść do obsługi przerwań wielokrotnych:
W trybie rzeczywistym (ang. real mode) pracy procesora adres procedury obsługi przerwania jest zapisany w tablicy wektorów przerwań. Przechowuje ona adresy poszczególnych procedur obsługi przerwań; przerwanie identyfikowane jest przez numer wektora przerwania i w przypadku procesorów serii x86 jest możliwych do 256 takich przerwań.
Tablica wektorów przerwań znajduje się w pierwszych 1024 (256 czterobajtowych adresów) komórkach pamięci operacyjnej.
W komputerach PC jest zazwyczaj 16 (efektywnie 15, co wynika z kaskadowego połączenia dwóch kontrolerów przerwań) 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 przerwania.
W trybie chronionym (ang. protected mode) pracy procesora x86 (zaczynając od procesora i286) 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) ustawioną na 0 (zobacz budowa deskryptora).
IDT może zawierać trzy różne rodzaje deskryptorów bram:
Gdy w procesorze PowerPC wystąpi przerwanie:
Przerwania dzieli się na klasy: precyzyjne/nieprecyzyjne (ang. precise/imprecise), synchroniczne/asynchroniczne oraz maskowalne/niemaskowalne. Każdemu przerwaniu przypisywany jest priorytet. Najwyższy priorytet mają przerwania ‘System reset’ (priorytet 1) i ‘Machine check’ (priorytet 2). Oba przerwania należą do asynchronicznych i niemaskowalnych. W związku z najwyższym priorytetem obsługa tych przerwań nie będzie nigdy opóźniona. Ponieważ pojedyncza instrukcja może wywołać więcej niż jedno przerwanie (przerwanie precyzyjne, synchroniczne z priorytetem 3), to kolejność ich obsługi jest ściśle określona w zależności od typu instrukcji (np. instrukcje odczytu i ładowania liczb stałoprzecinkowych mają tę samą kolejność).
Pozostałe priorytety są następujące:
4 – przerwania nieprecyzyjne, np. przerwania od jednostki zmiennoprzecinkowej
5 – przerwania maskowalne, nieprecyzyjne, asynchroniczne, np. przerwanie zewnętrzne (ang. external)
6 – przerwania maskowalne, nieprecyzyjne, asynchroniczne, np. decrementer
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.