POLITECHNIKA CZESTOCHOWSKA
Katedra Inżynierii Komputerowej
Seminarium z Systemów operacyjnych
Przerwania
Przemysław Króliszewski
Marek Krasuski
gr. IV rok II
Informatyka, Wydział Inżynierii
Mechanicznej i Informatyki
Wstęp
Mikroprocesory umożliwiają reagowanie na określone zdarzenie zewnętrzne,
pojawiające się asynchronicznie w stosunku do synchronicznie działającego mikroprocesora, za pośrednictwem linii przerwań. Termin „przerwanie” dobrze oddaje znaczenie tego zjawiska - powoduje ono zatrzymanie wykonującego się programu i przekazanie sterowania do programu, który to przerwanie obsługuje. Zdarzenia zewnętrzne mogą pojawiać się jednocześnie, a więc układy obsługi przerwań powinny umożliwiać:
wykrycie zgłaszanego przerwania;
zaakceptowanie (lub nie) zgłoszenia przerwania na podstawie selekcji priorytetu linii oraz stanu przerzutnika przerwań ustawianego programowo; jeżeli zgłoszenie o wyższym priorytecie przerywa program obsługi przerwania o niższym priorytecie, to system jest nazywany wielopoziomowym systemem priorytetowym;
Mechanizm przerwań jest użyteczny przy projektowaniu systemu komputerowego. Przerwania informują procesor o tym, co się dzieje w dołączonych do niego urządzeniach. Gdyby przerwań nie było, procesor chcąc pobrać dane z jakiegoś urządzenia zewnętrznego musiałby sprawdzać cyklicznie ich stan, czy któreś nie chce się zgłosić, co znacznie obniżyłoby efektywność pracy takiego systemu.
Z punktu widzenia pełnionych funkcji przerwania można podzielić na:
przerwania sprzętowe, lub zewnętrzne, informujące procesor że zmienił się stan urządzenia zewnętrznego, np.: naciśnięto lub zwolniono klawisz na klawiaturze, przyszedł znak przesłany przez łącze szeregowe RS itd.,
przerwania wewnętrzne procesora, generowane w sytuacjach błędnych, lub szczególnych, powstałych podczas pracy procesora (np.: nadmiar dzielenia, praca krokowa itd.)
przerwania programowe, generowane z programu, który wykona instrukcję przerwania INT.
Przerwania sprzętowe dzielą się dodatkowo na maskowalne i niemaskowalne. Każde przerwanie ma określony numer, który je definiuje np.:
0 - przerwanie generowane przy próbie dzielenia przez zero,
1 - przerwanie „praca krokowa”, generowane, gdy znacznik TF=1 i używane do testowania programu,
2 - przerwanie NMI
8 - przerwanie zegarowe generowane raz na sekundę
9 - przerwanie generowane przy naciśnięciu lub zwolnieniu klawisza
Każdemu przerwaniu jakie jest obsługiwane w systemie odpowiada program jego obsługi, którego adres jest przechowywany w specjalnej tablicy tzw. tablicy wektorów przerwań.
Przerwania programowe.
Przerwanie może być generowane rozmyślnie przez program, jeżeli wykona
on instrukcję INT z numerem przerwania. Przerwanie tego typu przypomina więc bardziej wywołanie procedury, niż zatrzymanie całego programu, gdyż autor decyduje kiedy program ma przerwać swoją pracę i przejść do procedury obsługi przerwania. W praktyce przerwania programowe stosuje się najczęściej do wykonywania operacji wejścia-wyjścia oraz pewnych operacji systemowych (np.: przydzielanie pamięci, ustawianie/pobieranie czasu itp.). Niektóre przerwania podzielone są na podfunkcje np. 10H czy 21H. Jeżeli chcemy wywołać jakąś funkcję systemową to w rejestrze AH umieszczamy numer funkcji i wywołujemy określone przerwanie . Przyporządkowanie numerów przerwań odpowiednim funkcjom zostało ustalone przez projektantów systemu DOS i oprogramowania wewnętrznego BIOS. Numery te możemy zmieniać, ale wówczas systemy oparte na z góry przyporządkowanym numerze przerwania odpowiedniemu źródłowi mogłyby przestać działać.
Przerwanie programowe generuje program za pomocą instrukcji asemblera INT, nie można z jednego programu wygenerować równolegle kilku przerwań. Jeżeli w programie są dwie kolejne instrukcje INT np.:
INT 10H
INT 60H
To będą one wykonywane sekwencyjnie przerwanie 60H zostanie wygenerowane dopiero po obsłużeniu przerwania 10H.
W literaturze możemy się spotkać z różnym nazewnictwem przerwań programowych mianowicie: przerwania sprzętowe wewnętrzne (hardware internal interrupts), przerwania stanów wyjątkowych (w skrócie stany wyjątkowe), lub pułapki.
3. Przerwania sprzętowe.
Przerwania sprzętowe mogą się pojawiać w dowolnym momencie i w dowolnej kolejności. Obsługą przerwań steruje układ 8259, tzw. PIC (Programable Interrupt Controller). Umożliwia on dołączenie ośmiu urządzeń zewnętrznych generujących przerwania. Przy pojawieniu się równocześnie więcej niż jednego przerwania sprzętowego PIC rozstrzyga, które przerwanie ma wyższy priorytet i informuje procesor że pojawiło się przerwanie. Kiedy program obsługujący przerwanie sprzętowe zrealizuje wszystkie niezbędne operacje składające się na obsługę tego przerwania, musi powiadomić o tym PIC, który może wtedy przyjąć następne przerwanie sprzętowe.
Istnieją dwa rodzaje przerwań sprzętowych maskowalne to jest takie które mogą być przekazane do procesora, oraz niemaskowalne, które muszą być przekazywane do procesora zawsze. Przerwanie niemskowalne NMI (Non Maskable Interrupt) generowane jest ono w sytuacjach krytycznych (gdyż ma ono najwyższy priorytet) np.:przy błędzie parzystości.
O tym czy przerwanie maskowalne jest maskowane czy nie informuje zancznik przerwań IF (interrupt flag) w rejestrze znaczników. Jeżeli jest on równy zero przerwania są maskowane. Zawartość znacznika możemy ustawiać lub zerować za pomocą instrukcji CLI (clear interrupts) zerowanie, oraz STI (set interrupts) ustawianie. Przerwana możemy także maskować wybiórczo tzn. powodować by przy ustawionym znaczniku IF (przerwania dozwolone) niektóre przerwana nie pojawiały się. W PIC istnieje rejestr maskowania przerwań, który określa które przerwania sprzętowe będą pojawiać się. Każdy bit tego rejestru odpowiada jednemu przerwaniu sprzętowemu (IRQ0 - IRQ7).
Tablica wektorów przerwań.
O tym gdzie w pamięci znajdują się programy obsługi przerwań decyduje tablica wektorów przerwań. Każdemu numerowi przerwania przyporządkowany jest tam adres programu obsługi tego przerwania. Każdy adres jest w postaci segment : offset. Adres początkowy tej tablicy znajduje się w specjalnym rejestrze IDTR (Interrupt Descriptor Tabele Register ). Adres przerwania o numerze N znajduje się w polu o adresie 0:N*4
000000 |
CS0 |
Wektor 0 |
|
IP0 |
|
000002 |
CS1 |
Wektor1 |
|
IP1 |
|
000004 |
CS2 |
Wektor2 |
|
IP2 |
|
000006 |
CS3 |
Wektor3 |
|
IP3 |
|
000008 |
CS4 |
Wektor4 |
|
IP4 |
|
Adres pamięci |
Tablica wektorów przerwań |
|
Rys1.Tablica wektorów przerwań
Obsługa przerwania.
Gdy pojawia się przerwanie procesor wykonuje kolejno następujące czynności:
przy przerwaniu sprzętowym kończy wykonywanie instrukcji, przy której pojawiło się przerwanie ;
generowane są dwa cykle potwierdzenia przyjętego zgłoszenia (towarzyszą im impulsy INTA); pierwszy umożliwia ustalenie priorytetów między zewnętrznymi układami obsługi przerwań, w trakcie drugiego mikroprocesor wprowadza dostarczony przez kontroler przerwań numer lokacji w tablicy wektorów przerwań;
procesor kładzie na stos kolejno zawartość rejestru znaczników, numer segmentu kodu i wartość przesunięcia;
zeruje znacznik IF;
ładuje do CS i IP adres pobrany z tablicy wektorów przerwań;
rozpoczyna wykonywanie programu obsługi przerwania od adresu CI:IP.
Czynności te są realizowane przez procesor przy każdym przerwaniu niezależnie od
Tego, czy jest to przerwanie sprzętowe, wewnętrzne czy programowe. Zerowanie znacznika IF ma na celu uniemożliwienie przyjęcia kolejnego przerwania w trakcie wykonywania programu obsługi przerwania. Sama obsługa przerwania polega na wykonaniu operacji odpowiednich dla tego przerwania, np.: dla przerwania sprzętowego klawiatury 9 operacje te polegają na odczytaniu z portu numeru klawisza, stwierdzeniu który klawisz naciśnięto, wstawieniu numeru i kodu znakowego tego klawisza do bufora. Po obsłużeniu przerwania powrót z programu jego obsługi realizuje się zazwyczaj za pomocą instrukcji asemblera IRET (interrupt return). Realizuje ona proces odwrotny do przerwania (pobiera ze stosu trzy kolejne słowa i ładuje je do odpowiednich rejestrów). W przypadku przerwania sprzętowego zgłaszanego przez PIC przed wykonaniem instrukcji IRET należy zawiadomić PIC, że dane przerwanie zostało obsłużone i że procesor może przyjmować następne przerwania, realizuje się to wysyłając polecenie EOI (end of interrupt).
Niektóre programy obsługujące przerwania na początku swojego działania zerują znacznik IF aby mogły być wykonywane inne przerwania w trakcie ich wykonywania.
6. Przerwania NMI.
Przerwanie niemaskowalne jest zrealizowane w ten sposób że Sygnał NMI przyłączony bezpośrednio do procesora jest generowany przez układ kontroli parzystości, układ kontroli zewnętrznych we-wy, lub koprocesor arytmetyczny. Przerwanie to (niezależnie od przyczyny) może być zewnętrznie maskowane z pomocą rejestru dostępnego pod adresem A0h. Wpisanie odpowiedniej wartości do tego rejestru powoduje zablokowanie lub odblokowanie przerwania NMI.
7.Realizacja sprzętowa.
Jak już wcześniej wspomniano kontrolą przerwań przesyłanych przez urządzenia zewnętrzne zajmuje się układ 8259. Sterownik ten posiada osiem wejść przerywających IRQ0 - IRQ7, wyjście INTR żądania przerwania (Interrupt Request) , wejście potwierdzenie przerwania INTA (Interrupt Acknowledge), magistralę danych D0-D7 służące do komunikacji między procesorem i kontrolerem, oraz wyjścia CAS0-CAS2 (Cascade) które tworzą lokalną magistralę adresową używaną przy kaskadowym łączeniu układów 8259A, umożliwia ona zaadresowanie do 8 takich układów.
Układ 8259A dysponuje trzema 8-bitowymi rejestrami: IMR, IRR i ISR. Pozycja bitowa n każdego z nich odpowiada jednemu z wejść IRn. Urządzenie połączone z wejściem o numerze n zgłaszając przerwanie ustawia bit n w rejestrze IMR (Interrupt Mask Register) jeżeli bit ten jest wyzerowany to informacja o przerwaniu przekazywana jest dalej i powoduje ustawienie bitu n w rejestrze IRR (Interrupt Request Register).
INT
INTA
Wejścia IR0-IR7
Rys2.schemat blokowy kontrolera 8259A
Wejścia przerywające mają priorytety malejące ze zwiększeniem numeru wejścia (IRQ0 - najwyższym, IRQ7 - najniższy. Wyjściowy sygnał żądania przerwania wprowadza się na wejście przerwania maskowalnego procesora. Gdy jakieś urządzenia zewnętrzne prześlą sygnał żądania przerwania na wejścia sterownika PIC wówczas ten wybiera przerwanie o najwyższym priorytecie i przesyła sygnał INTR na wejście procesora. Gdy procesor jest gotowy do przyjęcia przerwania powiadamia o tym sterownik PIC aktywnym sygnałem INTA. W tym momencie sterownik umieszcza na magistrali wektor adresu tego przerwania i procesor przechodzi do jego obsługi.
8. Kaskadowe łączenie sterowników.
Aby możliwe było w systemie komputerowym obsłużenie większej ilości przerwań stosuje się kaskadowe łączenie sterowników 8259. Realizowane jest to w ten sposób że do wejść przerywających jednego sterownika 8259 master przyłączane są wyjścia INTA z innych sterowników. Każdy przyłączony sterownik zwiększa liczbę wejść przerywających o 8, a więc umożliwia nam to osiągnięcie 64 poziomów przerwań na jedną kaskadę.
IRQ63
.
.
INT . IRQ32
CPU .
INTA .
8086 IRQ7
IRQ0
Rys.3. Ogólna zasada łączenia kaskadowego.
W modelach AT i PS/2 zastosowano kaskadowe połączenie dwóch kontrolerów uzyskując 15 wejść, bowiem jedno z wejść układu Master zużywamy na dołączenie układu Slave. Prowadzi to do przegrupowania priorytetów wejść; wejścia IR8 -15 (układu slave) otrzymują priorytety wyższy niż wejścia IR3-7 układu Master. Układy połączone są między sobą liniami adresowymi CAS0-CAS2 które dla układu master są wyjściami, a Slave wejściami.. Do obydwu kontrolerów doprowadzony jest sygnał z procesora INTA, ale tylko układ master łączy się swoim wyjściem INT z wejściem INTR procesora.
Fazy obsługi przerwania układu Slave wyglądają wtedy następująco:
zgłoszenie ustawia bit n rejestru IRR w układzie Slave i powoduje po opracowaniu priorytetów wysłanie sygnały INT do układu master
układ Master otrzymuje zgłoszenie na linii IR2, co powoduje ustawienie bitu 2 w jego rejestrze IRR
układ master po opracowaniu priorytetów własnych zgłoszeń wysyła sygnał INT do procesora
procesor odpowiada pierwszym sygnałem INTA
układ Master adresuje liniami CAS0-CAS2 układ Slave
w obu układach następuje jednoczesne przesunięcie bitu odpowiadającego obsługiwanemu sygnałowi z rejestru IRR do ISR
drugi impuls INTA wygenerowany przez CPU powoduje wystawienie na magistralę danych wektora przerwania.
7
INT
8259
INTA
0
7
8259
0
7
8259
0
Blok sterujący
Rejestr zgłoszeń IRR
Układ oceny priorytetu
Rejestr obsługi ISR
Rejestr maskujący IMR
Wewnętrzna magistrala układu 8259A