Do tematu: Podsystem wejścia-wyjścia

Do tematu: Struktury danych

struct irqaction

Jest to struktura zdefiniowana w pliku include/linux/interrupt.h. Służy do pamiętania sposobu obsługi przerwań pochodzących od urządzeń. W jądrze jest tablica wskaźników do tych struktur - irq_action o rozmiarze 16 (arch/i386/kernel/irq.c). Struktury irqaction są dynamicznie alokowane i inicjowane w czasie wywołania funkcji request_irq, która jako parametr dostaje m.in numer linii przerwania, wskaźnik do funkcji obsługi przerwania, wartość flagi, nazwę urządzenia, informacje o urządzeniu. Jeśli dla jakiejś linii przerwania nie zdefiniujemy funkcji obsługi, to jądro ma tablicę funkcji bad_IRQ*_interrupt, które wywołuje dla przerwania nie mającego funkcji obsługi. Jeśli ktoś chce się dowiedzieć, jakie urządzenia są przypisane do linii przerwań, to jest to w pliku /proc/interrupts.

void (*handler)(int, void *, struct pt_regs *) funkcja obsługi przerwania. Dostaje jako argumenty: numer linii przerwania, wskaźnik do struktury opisującej urządzenie, oraz wskaźnik do zawartości rejestrów procesora (struct pt_regs).
unsigned long flags flagi, mówiące o sposobie obsługi przerwania: kombinacja wartości SA_INTERRUPT, SA_SHIRQ, SA_SAMPLE_RANDOM. Znaczenie flag
unsigned long mask pole to służy do wskazywania, które przerwania są zamaskowane (wartości różnych bitów), przy inicjalizacji ustawiane na 0.
const char name nazwa urządzenia, od którego pochodzi przerwanie
void * dev_id wskaźnik do struktury opisującej urządzenie, przekazywany jako drugi argument do funkcji handler
struct irqaction * next wskaźnik do następnej struktury na liście odpowiadającej numerowi linii przerwania.

Znaczenie flag:

SA_INTERRUPT Jeżeli ta flaga jest ustawiona, to obsługa przerwania jest "szybka", następuje zamaskowanie innych przerwań, a po powrocie z funkcji obsługi przerwania nie następuje szeregowanie. Wywoływanie funkcji obsługi przerwania jest robione w funkcji do_fast_irq. Jeśli flaga nie jest ustawiona, to funkcja obsługi przerwania wykonuje się z odmaskowanymi przerwaniami, a po powrocie, jeśli trzeba, następuje szeregowanie (mówi o tym zmienna globalna need_resched). Funkcja obsługi przerwania jest wtedy wołana przez funkcję do_IRQ
SA_SHIRQ Jest tylko 16 linii przerwań, a urządzeń chcących korzystać z przerwań może być więcej. Ustawienie tej flagi umożliwia dzielenie jednej linii przez wiele urządzeń. Wtedy dla tego numeru linii przerwania mamy listę struktur irq_action.
SA_SAMPLE_RANDOM Jeśli ta flaga jest ustawiona, wywoływane są dodatkowo, niezależnie od obsługi tego przerwania pewne funkcje (add_interrupt_randomness, rand_initialize_irq - zdefiniowane w pliku /include/linux/random.h). Chodzi o to, że dane przerwanie może posłużyć jako źródło losowości dla generatora liczb losowych. Przerwania od zegara też mogą służyć jako takie źródło ale nadchodzą zbyt regularnie. Więcej informacji: plik drivers/char/random.c


Autorka: Anna Petryk