SO2 wyklad 5

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


Wyszukiwarka

Podobne podstrony:
SO2 wyklad 4
SO2 wyklad 11
SO2 wyklad 1
SO2 wyklad 13
SO2 wyklad 12
SO2 wyklad 8
SO2 wyklad 5
SO2 wyklad 3
SO2 wyklad 11
SO2 wyklad 12
SO2 wyklad 1 Wstęp
SO2 wyklad 13
SO2 wyklad 5 Obsługa przerwań
SO2 wyklad 14
SO2 wyklad 9
SO2 wyklad 10
Napęd Elektryczny wykład
wykład5

więcej podobnych podstron