SO2 wyklad 5 Obsługa przerwań

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 platformach sprz towych PC i do 16KB w 64 – bitowych

ą

ą

ę

platformach sprz towych 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 lub urz dzeniach, które s 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

To odnosi si tylko do komputerów klasy PC.

ę

1

background image

Systemy Operacyjne – semestr drugi

1.

local_irq_disable() - wy cza lokalny (dla jednego procesora) system przerwa ,

łą

ń

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().

W kolejnych wersjach j dra Linuksa serii 2.6 wprowadzono szereg zmian do górnych po ówek obs ugi przerwa . Pocz wszy od j dra 2.6.19 z prototypu procedury

ą

ł

ł

ń

ą

ą

obs ugi przerwania znikn

parametr przez który przekazywany by wska niki na struktur zawieraj c warto ci rejestrów sprzed chwili otrzymania przerwania.

ł

ął

ł

ź

ę

ą ą

ś

Niewiele procedur korzysta o z tych informacji, a ich przekazanie by o kosztowne pod wzgl dem czasu i miejsca na stosie. Dla tych, które potrzebuj warto ci rejestrów

ł

ł

ę

ą

ś

zdefiniowano funkcj o nazwie

ę

get_irq_regs(), która zwraca wska nik na struktur

ź

ę struct pt_regs. Wraz z wydaniem j dra 2.6.22 rozpocz to proces zast powania flag

ą

ę

ę

SA_* flagami IRQF_. Dzia anie to zako czono w wydaniu 2.6.24. Flaga SA_INTERRUPT zosta a najpierw zast piona flag IRQF_DISABLE, a nast pnie

ł

ń

ł

ą

ą

ę

IRQF_TIMER, flaga SA_SAMPLE_RANDOM flag IRQF_SAMPLE_RANDOM, a flaga SA_SHARED flag IRQF_SHARED. Poza tym dodano inne flagi, których

ą

ą

definicje mo na znale

w pliku

ż

źć

include/linux/interrupt.h. W j drze o numerze 2.6.31 wprowadzono mechanizm w tków przerwa . Intencj tego mechanizmu jest

ą

ą

ń

ą

umieszczenie obs ugi przerwania w osobnym w tku j dra, eliminuj c tym samym niedogodno ci zwi zane z brakiem blokowania w kontek cie przerwania oraz niektóre

ł

ą

ą

ą

ś

ą

ś

z ma o wygodnych w obs udze dolnych po ówek. Aby unikn

wymuszania zmiany w kodzie wszystkich sterowników urz dze ten mechanizm jest opcjonalny.

ł

ł

ł

ąć

ą

ń

Procedury obs ugi przerwania, które maj by wykonane w ramach w tku rejestrowane s za pomoc funkcji o nast puj cym prototypie:

ł

ą

ć

ą

ą

ą

ę

ą

int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t quick_check_handler, unsigned long flags, const char *name, void *dev)

W porównaniu z funkcj rejestruj c zwyk e procedury obs ugi przerwania przyjmuje ona dodatkowy parametr, b d cy wska nikiem na tzw. szybk procedur obs ugi

ą

ą ą

ł

ł

ę ą

ź

ą

ę

ł

przerwania. Ta procedura mo e oprócz tych samych warto ci co zwyk a procedura obs ugi przerwania zwróci

ż

ś

ł

ł

ć IRQ_WAKE_THREAD, która nakazuje aktywacj w tku

ę

ą

odpowiedzialnego za obs ug przerwania. Dodatkowo, aby u atwi autorom sterowników przej cie na model przerwa obs ugiwanych przez w tki, procedura ta mo e

ł

ę

ł

ć

ś

ń

ł

ą

ż

zwróci warto

IRQ_NEEDS_HANDLING, aby zasygnalizowa , e przerwanie musi by obs u one przez zwyk

procedur obs ugi przerwania. W tej wersji j dra

ć

ść

ć ż

ć

ł ż

łą

ę

ł

ą

wprowadzono tak e funkcj o prototypie:

ż

ę

int pci_enable_msi_block(struct pci_dev *dev, int count)

która pozwala w czy sterownikowi zg aszanie bloków przerwa MSI (ang.

łą

ć

ł

ń

Message Signaled Interrupts). Tego typu przerwania s wykorzystywane przez sprz t

ą

ę

korzystaj cy z magistrali PCI-Express lub PCI 2.2. W przeciwie stwie do tradycyjnych przerwa tego typu przerwania nie s zg aszane poprzez zmian stanu na

ą

ń

ń

ą

ł

ę

odpowiedniej linii przerwania lecz przez zapis przez urz dzenie informacji o niewielkim rozmiarze pod okre lony adres w pami ci. Ta informacja jest odczytywana przez

ą

ś

ę

PIC, który sygnalizuje przerwanie procesorowi.

2


Wyszukiwarka

Podobne podstrony:
Ćwiczenia na obsługi przerwań
WykladyGInz Obsluga Inwestycji2
SO2 wyklad 4
Wykład 1, Obsługa plików, Obsługa plików
zarzadzanie zasobami ludzkimi wyklad 1, Obsługa Ruchu Turystycznego
SO2 wyklad 11
SO2 wyklad 1
SO2 wyklad 13
SO2 wyklad 12
SO2 wyklad 8
SO2 wyklad 5
Wykład Język C# Obsługa Wyjątków Wyklad7 ObslugaWyjatkow
SO2 wyklad 3
SO2 wyklad 11
SO2 wyklad 12
SO2 wyklad 5
SO2 wyklad 1 Wstęp
SO2 wyklad 13

więcej podobnych podstron