Podręcznik

5. Przerwania

Uproszczona architektura systemu komputerowego klasy PC jest przedstawiona na rysunku 16. Składa się na nią procesor, pamięć główna, system magistral oraz sporo urządzeń wejścia-wyjścia. Sterowanie jest zrealizowane z wykorzystaniem chipsetu płyty głównej. Do urządzeń wejścia-wyjścia można zaliczyć skaner, drukarkę, ale również mysz, klawiaturę, dołączoną do systemu kartę sieciową, czy graficzną, dyski twarde. Bardzo ważna jest możliwość szybkiej komunikacji z tymi urządzeniami.

 

Rys. 16. Uproszczona architektura PC

 

Warte zauważenia jest to, że urządzenia wejścia-wyjścia wymagają szybkiej obsługi ze strony CPU w losowym czasie, nawet jeśli w danej chwili CPU wykonuje inne zadania (programy). Potrzebny jest jakiś mechanizm „zwrócenia uwagi na dane urządzenie”. Przerwania właśnie to umożliwiają. Na rysunku 17 jest przedstawiona idea systemu przerwań. Program jest wykonywany przez procesor w sposób sekwencyjny. W pewnym losowym czasie urządzenie zgłasza chęć obsługi poprzez przerwanie. Program jest przerywany z zapamiętaniem miejsca przerwania. Następnie wykonywana jest procedura obsługi urządzenia. Po jej zakończeniu następuje powrót do wykonywania przerwanego programu. W ten sposób można efektywnie obsługiwać urządzenia, które żądają obsługi w losowym czasie. Nie trzeba cały czas sprawdzać, czy wymagają obsługi, ponieważ same sygnalizują ten fakt. W niektórych systemach przerwanie może być przerwane przez inne przerwanie o wyższym priorytecie. Mówimy wtedy o zagnieżdżonej obsłudze przerwań.

 

Rys. 17. Obsługa przerwań

 

Podsumowując, przerwanie to wymuszona zmiana normalnego biegu programu. Zachodzi ono podobnie do zmiany kontekstu (wykonywanego aktualnie procesu):

  • sprzęt zapisuje na stosie potrzebne informacje dotyczące przerywanego programu,
  • dostarczany jest numer przerwania,
  • numer przerwania jest skojarzony z programem jego obsługi,
  • uruchamiany jest program obsługi przerwania,
  • po obsłudze przerwania jest wznawiany zatrzymany wcześniej program.

Istnieje wiele sytuacji powodujących przerwania. W ten sposób są obsługiwane nie tylko urządzenia wejścia-wyjścia, ale również inne zdarzenia. Stąd też przerwania można podzielić na klasy związane ze zdarzeniami, które je powodują. Poniżej wymienione są najważniejsze klasy przerwań:

  1. I/O – urządzenia wejścia/wyjścia.
  2. Sytuacje wyjątkowe, uszkodzenia sprzętu.
  3. Programowe – dzielenia przez zero, przepełnienie arytmetyczne.
  4. Zegarowe – generowane przez wewnętrzny zegar.

Przerwania są obsługiwane nieco odmiennie w zależności od konstrukcji systemu komputerowego i klasy przerwania. Tu skupimy się głównie na przerwaniach związanych z urządzeniami wejścia/wyjścia. Idea obsługi wszystkich przerwań pozostaje taka sama.

Początkowo w systemach klasy PC istniały tylko dwie możliwości zasygnalizowania przerwania sprzętowego. Należało doprowadzić sygnał do pinu ~INT, bądź ~NMI procesora. Ta druga opcja obsługiwała tzw. przerwania niemaskowalne, związane z obsługą błędów w pamięci. Przerwanie to ma najwyższy priorytet i zawsze powoduje wstrzymanie pracy systemu komputerowego z jednoczesnym wystawieniem odpowiedniego komunikatu. Przerwania doprowadzane do pinu ~INT, to typowe przerwania zgłaszane przez sprzęt. Są one zwane też przerwaniami maskowalnymi ze względu na możliwość ich zablokowania (zamaskowania). W najwcześniejszych komputerach PC obsługą przerwań zajmował się dedykowany układ 8259. Trochę później stosowano dwa takie układy połączone kaskadowo w celu zwiększenia liczby dostępnych przerwań (Rys. 18).

Rys. 18. Kaskadowe połączenie dwóch układów 8259A obsługujących przerwania sprzętowe

 

Przerwania obsługiwane w ten sposób oznaczano symbolem IRQx, gdzie x oznacza numer przerwania. Ponieważ układ 8259 obsługuje 8 przerwań, przez połączenie dwóch takich układów uzyskano możliwość doprowadzenia 15 przerwań (jedno doprowadzenie jest wykorzystane do połączenia układów). Sposób obsługi przerwania jest przedstawiony na rysunku 19. Urządzenia zgłaszające przerwania są połączone z wyprowadzeniami układu 8259. Urządzenie jest identyfikowane przez numer przerwania.

Rys. 19. Schemat ideowy układu 8259A do obsługi przerwań sprzętowych

 

Wystawienie aktywnego sygnału na wejście układu 8259 jest równoważne ze zgłoszeniem przerwania. Przerwania są obsługiwane w kolejności: im niższy numer przerwania, tym wyższy priorytet. Przerwanie o najwyższym priorytecie dopuszczane jest do obsługi. Każde przerwanie może być zablokowane przez ustawienie odpowiedniej flagi w rejestrze maskującym. Jeśli przerwanie jest dopuszczone do obsługi, układ 8259 wysyła sygnał na pin ~INT procesora i po otrzymaniu zezwolenia na przerwanie (pin ~INTA) generowana jest liczba identyfikująca przerwanie. Następuje, nadzorowany przez system operacyjny, skok do obsługi przerwania. Obecnie nie stosuje się już układów 8259. Jednak, w celu zachowania kompatybilności, do chwili obecnej istnieje możliwość wykorzystywania przerwań w ten sposób. Działanie układów 8259 jest emulowane przez chipset płyty głównej.

Opisany powyżej sposób obsługi przerwań jest ściśle związany z podstawową magistralą systemową obsługującą urządzenia I/O. W tym przypadku była to magistrala ISA. Następną magistralą systemową, która była szeroko wykorzystywana i jest niekiedy wykorzystywana we współczesnych komputerach, jest magistrala PCI. Wraz z pojawieniem się tej magistrali zmienił się nieco sposób obsługi przerwań. Przerwania obsługiwane przez magistralę PCI nazwano ~INTA, ~INTB, ~INTC, ~INTD. Są to linie, poprzez które można zgłaszać przerwania. Jednak sposób obsługi przerwań się nie zmienił. Nowe przerwania są tłumaczone przez specjalnie dodany router przerwań na stare ~IRQx, które są nieprzydzielone (Rys.20). W tym czasie zaczynało już brakować wolnych przerwań. Co prawda linie przerwań ~IRQ mogą być dzielone pomiędzy dwa lub więcej urządzeń, ale wtedy wykrywanie, które urządzenie zgłasza przerwanie spada na oprogramowanie. Nie zawsze dzielenie przerwań działało poprawnie.

 

Rys. 20. Schemat przydziału 16 linii przerwań PC

 

Począwszy od procesora Pentium 4, pojawiła się nowa metoda obsługi przerwań. Zastosowano zaawansowany kontroler obsługi przerwań (APIC – ang. Advanced Programable Interrupt Controller). W założeniu miał on umożliwić obsługę systemów wieloprocesorowych i później z procesorami wielordzeniowymi, gdzie różne procesory, czy rdzenie mogą obsłużyć przerwanie (Rys.21).

Rys. 21. Zaawansowany kontroler obsługi przerwań

 

W systemie z APIC obsługa przerwań jest realizowana przez I/O APIC znajdujący się na chipsecie. Do tego układu podłączone są urządzenia. Każdy procesor/rdzeń ma wbudowany układ „local APIC”. Układy „local APIC” są połączone specjalną magistralą z I/O APIC. I/O APIC rozdziela przerwania na poszczególne procesory/rdzenie. W systemie jednoprocesorowym APIC może symulować działanie „starego” układu obsługi przerwań (2x8259). Wraz z APIC dodano możliwość obsługi ośmiu dodatkowych przerwań. W sumie jest ich 24 (~IRQ0 do ~IRQ24). Mogło by się wydawać, że to duża liczba. Jednak liczba urządzeń wymagająca przerwań też znacznie się zwiększyła. Nadal pozostał do rozwiązania problem małej liczby przerwań.

Większość numerów przerwań jest przyporządkowywana automatycznie w trakcie startu systemu operacyjnego. Należy zaznaczyć, że przyporządkowanie przerwań jest zależne od sprzętu. Może być też ustanowione przez konfigurację sprzętową, czasem  jest ustawiane ręcznie, czasem programowo. Magistrala PCI ustawia przerwania w czasie startu systemu. Niektóre przerwania są stale przyporządkowane – związane z architekturą systemu (IRQ0: timer, IRQ2: kaskada do 8259A). Dwa urządzenia, które nie używają przerwania w tym samym czasie mogą je dzielić, nawet jeśli nie obsługują dzielenia przerwań.