2012-06-03 6 views
14

Na mainbord mamy kontroler przerwań (IRC), która działa jako multiplekser pomiędzy urządzeniami, które mogą podnieść przerwanie i procesor:Przerwanie magazynowe (Linux/General)

       |--------| 
      |-----------|  |  | 
-(0)------| IRC _____|______| CPU | 
-(...)----| ____/  |  |  | 
-(15)-----|/   |  |--------| 
      |-----------| 

Każde urządzenie jest skojarzone z IRQ (numer po lewej). Po każdym wykonaniu procesor wykrywa linię żądania przerwania. Jeśli zostanie wykryty sygnał, zostanie wykonane zapisanie stanu, a procesor załaduje procedurę obsługi przerwań, która znajduje się w wektorze przerwania, który znajduje się na stałym adresie w pamięci. O ile widzę numer IRQ i numer wektora w przerywanym wektorze nie są takie same, ponieważ mam na przykład moją kartę sieciową zarejestrowaną na IRQ 8. Na procesorze Intel Pentium wskazywałoby to na rutynę, która jest używana aby zasygnalizować jeden warunek błędu, więc musi być gdzieś odwzorowanie, które wskazuje właściwy handler.

Pytania:

1) Jeśli piszę sterownika i zarejestrować IRQ X dla niego. Skąd system wie, które urządzenie należy obsługiwać? Mogę na przykład użyć request_irq() z IRQ numer 10, ale w jaki sposób system wie, że program obsługi powinien być używany dla myszy lub klawiatury lub cokolwiek piszę sterownik?

2) Jak wygląda wtedy wektor przerwań? Chodzi mi o to, że jeśli użyję IRQ 10 dla mojego urządzenia, to zastąpi to standardowy handler, który jest przeznaczony do obsługi błędów w tabeli (pierwszy użyteczny to 32 zgodnie z Silberschatz (Operating System Concepts)).

3) Kto inicjuje ustawia przerwań IRQ? The Bios? System operacyjny?

4) Kto jest odpowiedzialny za dopasowanie IRQ i przesunięcia w przerywanym wektorze?

5) Można udostępniać IRQS. Jak to możliwe? Na płycie głównej znajdują się pasy sprzętowe, które łączą urządzenia z kontrolerem przerwań. W jaki sposób można skonfigurować pasy do tego samego Przerwania? Musi być tablica, która mówi o ścieżce 2 i 3 uchwytach IRQ15, np. Gdzie znajduje się ten stół i jak się go nazywa?

+0

Bardziej szczegółowe wyjaśnienie na przerwania instalacji, obsługi i mapowanie można znaleźć tutaj: [Kod odległości wewnątrz ram przerwania jądra] (http://linuxburps.blogspot.in/2013/10/linux-interrupt- handling.html) –

Odpowiedz

18

Odpowiedzi w odniesieniu do jądra Linuksa. Powinien działać również dla większości innych systemów operacyjnych.

1) Jeśli napiszę sterownik urządzenia i zarejestruję dla niego IRQ X. Skąd system wie, które urządzenie należy obsługiwać? Mogę na przykład użyć request_irq() z IRQ numer 10, ale w jaki sposób system wie, że program obsługi powinien być używany dla myszy lub klawiatury lub cokolwiek piszę sterownik?

Nie ma 1 odpowiedzi na to. Na przykład, jeśli jest to niestandardowy system wbudowany, projektant sprzętu poinformuje program piszący o napędzie "Mam zamiar skierować urządzenie x do irq". Dla większej elastyczności, na przykład dla karty sieciowej, która zazwyczaj wykorzystuje protokół PCI. Istnieje arbitraż na poziomie sprzętu/oprogramowania układowego, aby przypisać numer IRQ do nowego urządzenia po jego wykryciu. Zostanie to zapisane w jednym z rejestru konfiguracji PCI. Sterownik najpierw odczytuje ten rejestr urządzenia, a następnie rejestruje jego program obsługi przerwań dla tego konkretnego urządzenia irq. Będą podobne mechanizmy dla innych protokołów.

Co możesz zrobić, to sprawdzić połączenia z request_irq w kodzie jądra i dowiedzieć się, jak sterownik uzyskał wartość irq. Będzie to inne dla każdego rodzaju kierowcy.

Odpowiedź na to pytanie brzmi, system nie wie. Projektant sprzętu lub protokoły sprzętowe przekazują te informacje do sterownika nagrywarki. Następnie program piszący sterownika rejestruje program obsługi dla tego konkretnego programu irq, informując system, co należy zrobić, jeśli widzisz to polecenie.

2) Jak wygląda wtedy wektor przerwań? Chodzi mi o to, że jeśli użyję IRQ 10 dla mojego urządzenia, to zastąpi to standardowy handler, który jest przeznaczony do obsługi błędów w tabeli (pierwszy użyteczny to 32 zgodnie z Silberschatz (Operating System Concepts)).

Dobre pytanie. Są w nim dwie części.

a) Kiedy request_irq (irq, handler). System naprawdę nie programuje wejścia 0 w IVT lub IDT. Ale wpis N + irq. Gdzie N jest liczbą procedur obsługi błędów lub wyjątków ogólnego przeznaczenia obsługiwanych przez ten procesor. Szczegóły różnią się w zależności od systemu.

b) Co się stanie, jeśli błędnie zażądasz IRQ, który jest używany przez inny sterownik. Otrzymujesz błąd i IDT nie jest zaprogramowany z twoim handler'em.

Uwaga: IDT jest tabelą deskryptorów przerwań.

3) Kto inicjuje ustawia przerwań IRQ? The Bios? System operacyjny?

Najpierw Bios, a następnie OS. Ale są na przykład pewne systemy operacyjne, MS-DOS, które nie przeprogramowują IVT skonfigurowanego przez BIOS. Bardziej zaawansowane współczesne systemy operacyjne, takie jak Windows czy Linux, nie chcą polegać na konkretnych funkcjach biosu i przeprogramowują IDT. Ale bios musi to zrobić tylko wtedy, gdy system operacyjny pojawi się w obrazie.

4) Kto jest odpowiedzialny za dopasowanie IRQ i przesunięcia w przerywanym wektorze?

Naprawdę nie wiem, co masz na myśli. Przepływ jest taki. Najpierw twoje urządzenie ma przypisany numer IRQ, a następnie rejestrujesz go, używając tego numeru IRQ. Jeśli użyjesz nieprawidłowego numeru irq, a następnie włączysz przerwanie na swoim urządzeniu, nastąpi awaria systemu. Ponieważ przewodnik jest zarejestrowany na nieprawidłowy numer IRQ.

5) Można udostępniać IRQS. Jak to możliwe? Na płycie głównej znajdują się pasy sprzętowe, które łączą urządzenia z kontrolerem przerwań. W jaki sposób można skonfigurować pasy do tego samego Przerwania? Musi być tablica, która mówi o ścieżce 2 i 3 uchwytach IRQ15, np. Gdzie znajduje się ten stół i jak się go nazywa?

To jest bardzo dobre pytanie. Dodatkowa tabela nie jest taka, jak rozwiązano ją w jądrze. Zamiast każdego udostępnianego IRQ, programy obsługi są przechowywane na połączonej liście wskaźników funkcji. Jądro przechodzi przez wszystkie procedury obsługi i wywołuje je jeden po drugim, dopóki jeden z programów obsługi nie uzna przerwań za swój własny.

The code looks like this: 

driver1: 

d1_int_handler: 
     if (device_interrupted()) <------------- This reads the hardware 
     { 
      do_interrupt_handling(); 
      return MY_INTERRUPT; 
     }else { 
      return NOT_MY_INTERRUPT; 
     } 

driver2: 
     Similar to driver 1 


kernel: 
     do_irq(irq n) 
     { 
      if (shared_irq(n)) 
      { 
       irq_chain = get_chain(n); 
       while(irq_chain) 
       { 
        if ((ret = irq_chain->handler()) == MY_INTERRUPT) 
         break; 
        irq_chain = irq_chain->next; 
       } 
       if (ret != MY_INTERRUPT) 
        error "None of the drivers accepted the interrupt"; 
      } 
     } 
+2

Doskonała odpowiedź, thx! – fliX

+0

Dodałeś opis na IDT, czy mógłbyś dodać jeden do IVT? – einstein