POLITECHNIKA CZESTOCHOWSKA
Katedra Inżynierii Komputerowej
Seminarium z Systemów operacyjnych
Przerwania
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;
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ń.
1. Przerwania programowe.
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).
4. 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ń
5. Obsługa przerwania.
Gdy pojawia się przerwanie procesor wykonuje kolejno następujące czynności:
a) przy przerwaniu sprzętowym kończy wykonywanie instrukcji, przy której pojawiło się przerwanie ;
b) 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ń;
c) procesor kładzie na stos kolejno zawartość rejestru znaczników, numer segmentu kodu i wartość przesunięcia;
d) zeruje znacznik IF;
e) ładuje do CS i IP adres pobrany z tablicy wektorów przerwań;
f) 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).
Blok sterujący
INT
Wewnętrzna magistrala układu 8259A
INTA
Rejestr obsługi ISR
Układ oceny priorytetu
Rejestr zgłoszeń IRR
Wejścia IR0-IR7
Rejestr maskujący IMR
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ę.
7
8259
0
IRQ63
...
pozbierane