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