2010-04-10 16 views
8

Najpierw powinienem podzielić się wszystkim, co wiem - i to jest całkowity chaos. Na ten temat jest kilka różnych pytań, więc nie denerwuj się :).Jak procesor odnajduje ISR i rozróżnia urządzenia

1) Aby znaleźć numer ISR, procesor jest wyposażony w numer przerwania. W maszynach x86 (286/386 i nowszych) znajduje się IVT z ISR; każdy wpis o rozmiarze 4 bajtów. Musimy więc pomnożyć liczbę przerwań przez 4, aby znaleźć ISR. Tak więc pierwsza grupa pytań jest - jestem kompletnie zdezorientowany w mechanizmie CPU otrzymującym przerwanie. Aby podnieść przerwanie, najpierw urządzenie będzie szukało IRQ - a potem co? Numer przerwania przemieszcza się "na IRQ" w kierunku procesora? Czytałem także coś w rodzaju urządzenia umieszczającego adres ISR na magistrali danych; co to wtedy? Jaka jest koncepcja urządzeń zastępujących ISR. Czy ktoś może mi powiedzieć kilka przykładów urządzeń, w których procesor odpytuje za przerwania? I gdzie znajduje dla nich ISR?

2) Jeśli dwa urządzenia udostępniają IRQ (co jest bardzo możliwe), w jaki sposób procesor różni się między nimi? Co się stanie, jeśli oba urządzenia jednocześnie podniosą przerwanie o tym samym priorytecie. Dowiedziałem się, że będą maskowane przerwań tego samego typu i o niskim priorytecie - ale w jaki sposób odbywa się komunikacja między procesorem i kontrolerem urządzenia? Studiowałem rolę PIC i APIC dla tego problemu, ale nie mogłem zrozumieć.

Dzięki za przeczytanie. Dziękuję bardzo za odpowiedź.

Odpowiedz

12

Procesory nie odpytują za przerwania, przynajmniej nie w sensie programowym. W odniesieniu do oprogramowania przerwania są zdarzeniami asynchronicznymi.

Co się dzieje, że sprzęt w CPU rozpoznaje żądanie przerwania, które jest wejściem elektrycznym na linii przerwań, i w odpowiedzi odkłada normalne wykonanie zdarzeń w odpowiedzi na przerwanie. W większości współczesnych procesorów, to, co dzieje się dalej, jest określane przez uzgadnianie sprzętowe, w szczególności z typem procesora, ale większość z nich otrzymuje pewną liczbę z urządzenia przerywającego. Ta liczba może wynosić 8 bitów lub 32 lub cokolwiek, w zależności od projektu procesora. Następnie CPU używa tego numeru przerwania do zaindeksowania w tablicy wektorów przerwań w celu znalezienia adresu w celu rozpoczęcia wykonywania procedury obsługi przerwania. Po określeniu tego adresu (i aktualny kontekst wykonania jest bezpiecznie zapisywany na stosie) CPU rozpoczyna wykonywanie ISR.

Gdy dwa urządzenia współdzielą linię żądania przerwania, mogą powodować uruchamianie różnych ISR, zwracając inny numer przerwania podczas tego procesu uzgadniania. Jeśli masz wystarczającą liczbę wektorów, każde urządzenie przerywające może użyć własnego wektora przerwań.

Ale dwa urządzenia mogą nawet współużytkować linię żądania przerwania i wektor przerwań, pod warunkiem, że udostępniony ISR jest wystarczająco inteligentny, aby powrócić do wszystkich możliwych źródeł danego przerwania, i sprawdzić rejestry stanu, aby zobaczyć, które urządzenie wymaga usługi .

Trochę więcej szczegółów

Załóżmy, że masz system składający się z jednostki centralnej, a kontroler przerwań, a urządzenie przerywa. W dawnych czasach byłyby to oddzielne fizyczne urządzenia, ale teraz wszystkie trzy mogą znajdować się w tym samym chipie, ale wszystkie sygnały nadal znajdują się wewnątrz ceramicznego pudełka. Zamierzam użyć procesora powerPC (PPC) ze zintegrowanym kontrolerem przerwań, podłączonym do urządzenia na szynie PCI, jako przykład, który powinien ładnie służyć.

Załóżmy, że urządzenie to port szeregowy, który przesyła niektóre dane. Typowy sterownik portu szeregowego ładuje kilka danych do urządzenia FIFO, a procesor może wykonywać regularne prace, gdy urządzenie wykonuje swoje zadanie.Zwykle urządzenia te mogą być skonfigurowane do generowania żądania przerwania, gdy urządzenie ma mało danych do przesłania, aby sterownik urządzenia mógł wrócić i wprowadzić do niego więcej.

Logika sprzętowa urządzenia oczekuje potwierdzenia przerwania magistrali PCI, w którym to momencie może się zdarzyć kilka rzeczy. Niektóre urządzenia wykorzystują funkcję "autovectoring", co oznacza, że ​​polegają na kontrolerze przerwań, aby upewnić się, że wybrana zostanie właściwa procedura serwisowa. Inni będą mieli rejestr, który sterownik urządzenia będzie wstępnie programował, zawierający wektor przerwań, który urządzenie umieści na magistrali danych w odpowiedzi na potwierdzenie przerwania, aby kontroler przerwań odebrał sygnał.

Magistrala PCI ma tylko cztery linie przerwań, więc nasze urządzenie szeregowe będzie musiało potwierdzić jedną z nich. (Nie ma znaczenia, które w danej chwili jest zwykle zależne od slotu). Następny w kolejności jest kontroler przerwań (np. PIC/APIC), który zdecyduje, czy potwierdzić przerwanie na podstawie bitów maski, które zostały ustawione w własne rejestry. Zakładając, że potwierdza przerwanie, albo otrzymuje wektor z urządzenia przerywającego (przez linie magistrali danych), albo może, jeśli tak zaprogramować, użyć wartości "w puszkach" dostarczonej przez sterownik urządzenia APIC. Do tej pory procesor był błogo nieświadomy wszystkich tych zdarzeń, ale to się wkrótce zmieni.

Teraz nadszedł czas, aby kontroler przerwań zwrócił uwagę rdzenia procesora. Procesor będzie miał własne bity maski przerwań, które mogą spowodować, że po prostu zignoruje żądanie z PIC. Zakładając, że procesor jest gotowy do wykonywania przerwań, nadszedł czas na rozpoczęcie prawdziwej akcji. Aktualna instrukcja zwykle musi zostać wycofana przed rozpoczęciem ISR, więc w przypadku potokowych procesorów jest to trochę skomplikowane, ale wystarczy powiedzieć, że w pewnym momencie strumienia instrukcji kontekst procesora jest zapisywany na stosie i na sprzęcie -determinowane ISR przejmuje.

Niektóre rdzenie procesora mają wiele linii żądań i mogą rozpocząć proces zawężania, który ISR jest uruchamiany za pomocą logiki sprzętowej przeskakującej wskaźnik instrukcji procesora do jednej z kilku procedur obsługi najwyższego poziomu. Stare 68K i prawdopodobnie inni zrobili to w ten sposób. PowerPC (i uważam, że x86) ma jedno wejście żądania przerwania. Sam x86 zachowuje się trochę jak PIC i może uzyskać wektor z zewnętrznego PIC, ale powerPC po prostu przeskakuje do stałego adresu, 0x00000500.

W PPC kod 0x0500 prawdopodobnie od razu wyskoczy gdzieś w pamięci, gdzie jest wystarczająco dużo miejsca na jakiś poważny kod decyzyjny, ale nadal jest to rutynowa procedura obsługi przerwań. Ta procedura najpierw przejdzie do PIC i uzyska wektor, a także poprosi PIC o zaprzestanie wysyłania żądania przerwania do rdzenia procesora. Gdy wektor jest znany, najwyższy poziom ISR może uwzględniać bardziej szczegółowy program obsługi, który obsługuje wszystkie urządzenia, o których wiadomo, że używają tego wektora. Specyficzny dla użytkownika handler następnie idzie w dół listy urządzeń przypisanych do tego wektora, sprawdzając bity statusu przerwania w tych urządzeniach, aby zobaczyć, które z nich wymagają usługi.

Po znalezieniu urządzenia, takiego jak hipotetyczny port szeregowy, wymagającego usługi, ISR dla tego urządzenia podejmuje odpowiednie działania, na przykład ładowanie kolejnych danych FIFO z bufora systemu operacyjnego do FIFO transmitującego port. Niektóre urządzenia automatycznie upuszczają żądanie przerwania w odpowiedzi na dostęp do nich, na przykład zapisanie bajta do transmitującego FIFO może spowodować, że urządzenie portu szeregowego usunie linię żądania. Inne urządzenia będą wymagać specjalnego bitu rejestru kontrolnego do przełączania, ustawiania, usuwania, co-masz-ciebie, aby odrzucić żądanie. Istnieją miliardy różnych urządzeń wejścia/wyjścia i żadna z nich nigdy nie wydaje się robić tego w ten sam sposób, więc trudno jest generalizować, ale to zwykle jest sposób.

Teraz, oczywiście, jest więcej do powiedzenia - a co z priorytetami przerywającymi? co dzieje się w procesorze wielordzeniowym? A co z zagnieżdżonymi kontrolerami przerwań? Ale spaliłem wystarczająco dużo miejsca na serwerze. Nadzieja, że ​​to wszystko pomaga.

+0

Dzięki Jeff. Chociaż moje pytanie wciąż tam jest. Rozumiem, że istnieje numer przerwania używany do znalezienia ISR. Następnie moje dalsze pytanie brzmiało, w jaki sposób procesor jest dostarczany z tym numerem? Czy dzieje się to za pośrednictwem magistrali danych lub jak inaczej? A także, gdzie APIC pasują do obrazu dla urządzeń udostępniających IRQ? Twój wpis był bardzo przydatny, przypominając mi użycie rejestrów stanu urządzenia. Dziękuję Ci bardzo. –

+0

Niezłe wyjaśnienie Jeff. Jeszcze raz dziękuję za wysiłek. Miałem podobne myśli, jak mogłaby istnieć struktura podobna do drzewa do obsługi przerwań. Ale teraz wiem, że inni też myślą tak samo i zrobiłeś miły komentarz na ten temat. Dzięki jeszcze raz. –

+0

Jedno małe pytanie. _Interrupt vector_ to po prostu liczba, która jest wejściem do _interpretacyjnego wektora table_, aby uzyskać adres ISR. Więc jak to jest ** Vector **? ** Liczba przerwań ** jest w porządku. – Shashwat

4

Przyszedłem na to pytanie jak po 3 latach .. nadzieję, że mogę pomóc;)

Intel 8259A lub po prostu "PIC" ma 8 szpilek, IRQ0-IRQ7 każdy pin podłączyć do jednego urządzenia.

Załóżmy, że nacisnąłeś przycisk na klawiaturze .. napięcie pin IRQ1, który jest podłączony do KBD, jest wysokie. Więc po przerwaniu procesora potwierdź przerwanie połączenia. PIC dodaje po prostu 8 do numeru linii IRQ, więc IRQ1 oznacza 1 + 8, co oznacza, że ​​9

SO CPU ustawia swoje CS i IP na 9 pozycję w wektorze Tabela .. a ponieważ IVT tablicą długościami po prostu pomnożyć liczbę komórek przez 4;)

CPU.CS = IVT [9] .CS CPU.IP = IVT [9] .IP

ESR zajmuje się urządzeniem za pośrednictwem portów I/O;) Przepraszam za mój zły angielski .. jestem jednak Arabem :)

Powiązane problemy