Systemy Operacyjne – semestr drugi
Wyk ad pi ty
ł
ą
Obs uga przerwa
ł
ń
Jednym z zada systemu operacyjnego jest komunikacja z urz dzeniami wej cia – wyj cia. Poniewa s one zazwyczaj du o wolniejsze od procesora, to zwykle nie
ń
ą
ś
ś
ż ą
ż
oczekuje on na zako czenie przez nie dzia ania, mimo to powinien wiedzie kiedy taki moment nast pi. Jednym z rozwi za tej kwestii jest okresowe sprawdzanie
ń
ł
ć
ą
ą
ń
stanu takich urz dze , czyli tzw.
ą
ń
polling. Niestety, to rozwi zanie mo e prowadzi do sytuacji, w której system operacyjny mo e „przegapi ” informacj , któr przes a o
ą
ż
ć
ż
ć
ę
ą
ł ł
urz dzenie. Lepszym rozwi zaniem jest zastosowanie systemu przerwa . Przerwanie jest sygna em dla procesora, e oto jakie urz dzenie zewn trzne wykona o swoj
ą
ą
ń
ł
ż
ś
ą
ę
ł
ą
prac i nale y je odpowiednio obs u y . Przerwania s najcz
ciej generowane asynchronicznie – mog pojawi si w dowolnym momencie pracy procesora. Ka de
ę
ż
ł ż ć
ą
ęś
ą
ć
ę
ż
urz dzenie dysponuje po czeniem z
ą
łą
kontrolerem przerwa . Kiedy chce zg osi przerwanie sygnalizuje to za pomoc tego w a nie po czenia. Kontroler powiadamia
ń
ł
ć
ą
ł ś
łą
o wyst pieniu przerwania procesor. Ka demu urz dzeniu jest równie przyporz dkowany numer przerwania, który pozwala okre li , które urz dzenie zg osi o
ą
ż
ą
ż
ą
ś ć
ą
ł
ł
przerwanie i jak to przerwanie nale y obs u y . Numer przerwania skojarzony jest z lini zg oszenia przerwania IRQ (
ż
ł ż ć
ą
ł
ang. Interrupt Request). W komputerach
kompatybilnych z IBM PC cz
przerwa jest na sta e przypisana pewnym urz dzeniom, a cz
– w szczególno ci dla tych urz dze , które s pod czone z
ęść
ń
ł
ą
ęść
ś
ą
ń
ą
łą
systemem
przez magistral PCI – jest przydzielana w sposób dynamiczny. Oprócz obs ugi urz dze zewn trznych system przerwa pozwala na obs ug sytuacji wyj tkowych.
ę
ł
ą
ń
ę
ń
ł
ę
ą
Z ka dym przerwaniem, które jest skojarzone z urz dzeniem lub wyj tkiem zwi zana jest procedura obs ugi takiego przerwania (
ż
ą
ą
ą
ł
ang. interrupt handler lub interrupt
service routine – ISR). W przypadku Linuksa procedury te s po prostu funkcjami napisanymi w j zyku C i umieszczonymi w sterowniku danego urz dzenia lub
ą
ę
ą
w cz
ci j dra odpowiedzialnej za obs ug wyj tku. Ka da z takich funkcji jest napisana zgodnie z okre lonym prototypem. Od zwyk ych funkcji ró ni je jedynie to, e
ęś
ą
ł
ę
ą
ż
ś
ł
ż
ż
wykonywane s w kontek cie przerwania i wy cznie w reakcji na pojawienie si sytuacji krytycznej lub sygna u od urz dzenia. Procedura obs ugi przerwania
ą
ś
łą
ę
ł
ą
ł
wywo ywana jest w sposób asynchroniczny i dlatego wa nym jest, aby jej wykonanie zosta o zako czone w jak najkrótszym czasie. Z tego powodu kod obs ugi przerwa
ł
ż
ł
ń
ł
ń
jest podzielony na dwie cz
ci zwane
ęś
górną po ówk
ł
ą i doln po ówk
ą
ł
ą. Górna po ówka wykonuje wszystkie czynno ci, których wykonanie jest konieczne zaraz po
ł
ś
odebraniu sygna u przerwania, przede wszystkim powiadamia urz dzenie o przyj ciu przerwania. Po ówka dolna realizuje wszystkie te czynno ci, których wykonanie
ł
ą
ę
ł
ś
mo na odroczy na pewien czas. Zazwyczaj jednak po ówki dolne s wykonywane zaraz po wykonaniu po ówek górnych.
ż
ć
ł
ą
ł
Ka da procedura obs ugi przerwania musi zosta zarejestrowana za po rednictwem funkcji
ż
ł
ć
ś
request_irq, która kojarzy funkcj z przerwaniem i uaktywnia dan lini :
ę
ą
ę
int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_reqs *), unsigned long irqflags, const char *devname, void *dev_id)
Pierwszy parametr okre la numer przerwania, drugi jest wska nikiem na procedur obs ugi przerwania, trzeci parametr albo jest zerem, albo mask bitow mog c si
ś
ź
ę
ł
ą
ą
ą ą
ę
sk ada z trzech znaczników: SA_INTERRUPT – okre la czy dana procedura jest szybk procedur obs ugi przerwania, je li tak, to jest ona wykonywana przy
ł
ć
ś
ą
ą
ł
ś
wy czonych wszystkich przerwaniach w
łą
systemie. Obecnie wymaga tego jedynie procedura obs ugi przerwania zegarowego, SA_SAMPLE_RANDOM – okre la, czy
ł
ś
przerwanie zasili pul entropii j dra, SA_SHIRQ – okre la mo liwo wspó dzielenia linii przerwania z innymi procedurami obs ugi przerwa . Ka da z nich musi by
ę
ą
ś
ż
ść
ł
ł
ń
ż
ć
rejestrowana z tym znacznikiem ustawionym. Czwarty parametr, to nazwa urz dzenia, która jest u ywana w katalogu
ą
ż
/proc/irq i w pliku /proc/interrupts. Ostatni
parametr jest u ywany w obs udze linii wspó dzielonych. Pozwala on na zwolnienie linii z tylko jednej procedury obs ugi. Je li linia nie jest wspó dzielona
ż
ł
ł
ł
ś
ł
przekazywana jest warto NULL, ale w przypadku linii wspó dzielonych przekazywany jest wska nik na struktur sterownika, która mo e by wykorzystywana przez
ść
ł
ź
ę
ż
ć
procedury obs ugi przerwa . Funkcja
ł
ń
request_irq() zwraca zero, je li jej wykonanie zako czy si sukcesem. Dosy powszechnym b dem jest b d -EBUSY. Funkcja ta
ś
ń
ę
ć
łę
łą
mo e ulega blokowaniu, wi c nie mo e by u yta w kontek cie przerwania.
ż
ć
ę
ż
ć ż
ś
Komplementarn do
ą
request_irq() jest funkcja free_irq():
void free_irq(unsigned int irq, void *dev_id)
Funkcja ta zwalnia lini IRQ okre lon warto ci parametru „irq”. W przypadku linii wspó dzielonych konieczne jest okre lenie urz dzenia, gdy z linii usuwana jest
ę
ś
ą
ś ą
ł
ś
ą
ż
tylko procedura zwi zana z tym urz dzeniem. W przypadku linii niewspó dzielonych mo na przekaza NULL.
ą
ą
ł
ż
ć
Funkcje obs ugi przerwa s definiowane wed ug nast puj cego prototypu:
ł
ń ą
ł
ę
ą
static irqreturn_t intr_handler(int irq, void *dev_id, struct pt_regs *regs)
Pierwszy parametr okre la numer linii przerwania. Drugi jest unikaln warto ci identyfikuj c urz dzenie, które wspó dzieli z innymi urz dzeniami lini przerwania.
ś
ą
ś ą
ą ą
ą
ł
ą
ę
T warto ci mo e by adres struktury sterownika, który jest tak e przydatny podczas dzia ania funkcji. Ostatni parametr jest wska nikiem na struktur
ą
ś ą
ż
ć
ż
ł
ź
ę
przechowuj c stan rejestrów procesora sprzed wywo ania procedury obs ugi przerwania. Nie wymaga si , aby funkcje te by y wielobie ne, gdy wywo anie funkcji
ą ą
ł
ł
ę
ł
ż
ż
ł
powoduje zablokowanie linii z ni zwi zanej. Funkcje te mog zwraca dwie warto ci: IRQ_HANDLED i IRQ_NONE. W ich miejsce mo na wykorzysta makrodefinicj
ą
ą
ą
ć
ś
ż
ć
ę
IRQ_RETVAL(x), która zwraca IRQ_HANDLED je li
ś
x jest ró ny od zera i IRQ_NONE w przeciwnym przypadku. Typ warto ci zwracanej przez funkcj zosta
ż
ś
ę
ł
wprowadzony celem zachowania kompatybilno ci z poprzednimi wersjami j dra.
ś
ą
Procedury obs ugi przerwa s wywo ywane w kontek cie przerwania, co oznacza, e nie s dozwolone w nich wywo ania funkcji blokuj cych oraz nie jest wa na
ł
ń ą
ł
ś
ż
ą
ł
ą
ż
warto
(
ść ang. invalid) zwracana przez makrodefinicj
ę current. Procedury obs ugi przerwania musz wykonywa si szybko, aby nie blokowa kolejnych zg osze
ł
ą
ć
ę
ć
ł
ń
przerwania na tej samej linii. Korzystaj one ze stosu j dra, który jest ograniczony do 8KB w 32 – bitowych architekturach PC i do 16KB w 64 – bitowych
ą
ą
architekturach Alpha.
W chwili otrzymania zg oszenia przerwania j dro zapami tuje bie
ce warto ci rejestrów na stosie i wywo uje funkcj
ł
ą
ę
żą
ś
ł
ę do_IRQ(). Ta funkcja odczytuje numer
przerwania z warto ci rejestrów od o onych na stosie, a nast pnie potwierdza przyj cie przerwania i
ś
ł ż
ę
ę
blokuje lini z nim zwi zan wywo uj c
ę
ą
ą
ł ą mask_and_ack_8259A()
1
.
Dalej do_IRQ() sprawdza, czy linia posiada jak
zarejestrowan procedur obs ugi i czy nie jest ona w danej chwili wykonywana. Kolejn czynno ci jest wywo anie
ąś
ą
ę
ł
ą
ś ą
ł
handle_IRQ_event(). Ta funkcja przegl da list wszystkich procedur zwi zanych z dan lini i po kolei je uruchamia. Je li jest ustawiony znacznik
ą
ę
ą
ą
ą
ś
SA_SAMPLE_RANDOM, to wywo uje równie
ł
ż add_interrupt_randomness(), po czym ko czy swe dzia anie i sterowanie wraca do
ń
ł
do_IRQ(), która porz dkuje stos
ą
i wywo uje
ł
ret_from_intr(). Ta ostatnia wykonuje czynno ci zwi zane z przywróceniem pracy procesu u ytkownika b d kodu j dra.
ś
ą
ż
ą ź
ą
Informacje statystyczne na temat przerwa obs ugiwanych przez poszczególne procesory w systemie mo na znale w
ń
ł
ż
źć
pliku /proc/interrupts. S tam informacje o
ą
liczbie
obs u onych przerwa , na danej linii, o urz dzeniu, które jest skojarzone z t lini , oraz o kontrolerze przerwa , który obs uguje zg oszenie danego przerwania.
ł ż
ń
ą
ą
ą
ń
ł
ł
Do obs ugi systemu przerwa w j drze zdefiniowano nast puj ce funkcje:
ł
ń
ą
ę
ą
1.
local_irq_disable() - wy cza lokalny (dla jednego procesora) system przerwa ,
łą
ń
1
To odnosi si tylko do komputerów klasy PC.
ę
1
Systemy Operacyjne – semestr drugi
2.
local_irq_enable() - komplementarna wzgl dem poprzedniej funkcji,
ę
3.
local_irq_save(unsigned long flags) - zachowuje bie
cy stan przerwa ,
żą
ń
4.
local_irq_restore(unsigned long flags) - przywraca zapami tany stan przerwa ,
ę
ń
5.
disable_irq_nosync(unsigned int irq) – natychmiastowe wy czenie przerwania o zadanym numerze,
łą
6.
disable_irq(unsigned int irq) – jak wy ej, ale z odczekaniem, a zako czone zostan wywo ania procedur obs ugi przerwa skojarzonych z t lini ,
ż
ż
ń
ą
ł
ł
ń
ą
ą
7.
enable_irq(unsigned int irq) – odblokowanie przerwania (komplementarna do disable_irq_nosync()),
8.
synchronize_irq(unsigned int irq) – jak wy ej (komplementarna do
ż
disable_irq()),
9.
irqs_disabled() - sprawdzenie stanu lokalnego systemu przerwa ,
ń
10.
in_interrupt() - okre lenie kontekstu wykonywanego kodu,
ś
11.
in_irq() - okre lenie, czy aktualnie wykonywany kod jest realizowany w ramach procedury obs ugi przerwania.
ś
ł
Funkcje local_irq_disable() i local_irq_enable() zast pi y funkcje
ą ł
cli() i sti(), które wy cza y system przerwa dla wszystkich procesorów dost pnych w systemie i nie
łą
ł
ń
ę
by y w zwi zku z tym optymalne. Dzia anie tych funkcji nie jest bezpieczne, wi c nale y zapami ta i potem przywróci stan przerwa za pomoc pary nast pnych
ł
ą
ł
ę
ż
ę ć
ć
ń
ą
ę
funkcji. Funkcje disable_irq_nosync() i enable_irq() oraz disable_irq() i synchronize_irq() musz by wykonywane naprzemiennie, tzn. je li zosta a wykonana okre lona
ą
ć
ś
ł
ś
liczba np.: funkcji disable_irq_nosync(), to tyle samo musi nast pi wykona funkcji
ą ć
ń
enable_irq().
2