background image

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

background image

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