2016-01-22 50 views
5

Co jest potrzebne do wyłączenia wszystkich przerwań podczas inicjalizacji systemu lub na poziomie kodu startowego. Jeśli nie wyłączę przerwań, co się stanie?Dlaczego musimy wyłączyć wszystkie przerwania podczas uruchamiania systemu lub inicjalizacji systemu?

+5

Musisz, ponieważ Twoje procedury obsługi przerw nie są jeszcze zainstalowane. Jeśli nie wyłączysz ich, a otrzymasz przerwanie, system/startup się zawiesi. –

+3

nie chcesz, aby przerwania były uruchamiane, zanim zainstalujesz odpowiednie moduły obsługi i zainicjowały wszystkie konstrukcje danych, które są używane przez procedury obsługi. w przeciwnym razie możesz nie uzyskać nieprzewidywalnego zachowania. –

+1

Jeśli piszesz system operacyjny w trybie rzeczywistym, wyłączanie przerwań może nie być wymagane.Domyślna tabela przerwania trybu rzeczywistego będzie dostępna dla danego BIOS/sprzętu. Jeśli chcesz utworzyć system operacyjny w trybie chronionym, musisz wyłączyć przerywanie, zanim przejdziesz w tryb chroniony. Jeśli przełączysz się w tryb chroniony z włączonymi przerwaniami i nie ma tablicy wektorów przerwań (IVT), prawdopodobnie wystąpi potrójny błąd. Po przejściu do trybu chronionego można skonfigurować program IVT, a następnie włączyć ponownie przerwań. –

Odpowiedz

6

Istnieje kilka sytuacji, w których przerwania są niepożądane, więc są wyłączone.
Przykłady są liczne, ale przy mojej głowie mogę wymyślić nich:

  • Modyfikacjass:(e)sp. W przypadku wystrzelenia przerwania rejestr flags jest przesuwany na stos. Nieprawidłowa wartość stosu przeniesie tę kopię do losowej lokalizacji. Zmiana ss:(e)sp nie jest atomowa, co najmniej na x86, ponieważ składa się z wielu instrukcji, więc przerwanie może odpalić pomiędzy.
    Jednakże, jeśli poprawnie napiszesz swój kod, możesz osiągnąć tę samą niepodzielność bez wyłączania przerwań, ponieważ są one automatically disabled on certain occasions.

    @MichaelPetch wypowiedział jakąś specjalność około 8088 procesorów (dalej „słabszego brata” z 8086, pierwszy procesor x86), przedstawiaj wyjątek od tych „pewnych okazjach”, w komentarzach do tej odpowiedzi:

    Jest tak w przypadku wyłączania przerwań do końca następnej instrukcji (po przeniesieniu wartości do SS), ale były procesory 8088 z błędem, w którym przerwania nie zostały poprawnie wyłączone po zmianie . Ci z nas (dinozaury) często umieszczają CLI/STI wokół aktualizacji SS:SP na wszelki wypadek (szanse na uruchomienie systemu 8088 z takim błędem są prawdopodobnie bliskie zeru). Z historycznego punktu widzenia ten PC mag article może rzucić nieco światła na ten starożytny problem z numerem .

    (formatujących Kod dodany.)

  • Brak z IDT/IVT. Gdy tryb chroniony IDT zostanie zainicjowany lub 16-bitowy tryb rzeczywisty IVT zostanie zmodyfikowany (lub wyzerowany lub coś podobnego), przerwanie zostanie przeskoczone do miejsca w pamięci, w którym nie ma instrukcji.

Ogólnie można powiedzieć, że operacje modyfikujące IDT/IVT w jakiś sposób nieatomowy wymagają wyłączenia przerwań.


Tak na marginesie: Ja napisałem kilka bootloadera już i zwykle wyłączenie przerwań przez cały czas pracy z bootloadera. W trybie chronionym ponownie je włączam. Linux 4.2 obsługuje to podobnie. Jeśli jesteś zainteresowany, przeczytaj jego kod źródłowy (/arch/x86/boot/) lub ten z Minixa!

+1

Właściwie na x86 nie ma potrzeby wyłączania przerwań w pierwszym przypadku z powodu specjalnej reguły: Przerwania są wyłączane dla jednego cyklu po 'pop% ss', więc masz czas na ustawienie wskaźnika stosu. – fuz

+0

@FUZxxl Zrobione. Czy mógłbyś na to spojrzeć, proszę? – Downvoter

+0

To prawda, ale zachowaj ostrożność, subtelne zachowanie jest powiązane z wykonywaniem wielu takich instrukcji z rzędu. – fuz