Przerwania BIOS vs Przerwania sprzętowe
Na chipie x86 pracującym w trybie rzeczywistym przerwania są rozwiązywane za pomocą IVT (tablica wektorów przerwań), która jest tablicą znajdującą się pod adresem 0000h: 0000h, która składa się z 256 wpisów, adresów 32-bitowych (segment + przesunięcie), które wskaż kod obsługi przerwań.
Ta strona (wraz z wieloma innymi) podaje, że pierwsza definiowana przez użytkownika procedura obsługi przerwań to 20h. Pierwsze 32 programy obsługi są zarezerwowane i używane do różnych celów. Na przykład przerwanie 10h jest używane dla wyjątków x87 FPU, podczas gdy przerwanie 13h jest używane dla wyjątków SIMD FP. Jednak ta strona (wraz z wieloma innymi, w tym z listą przerwań Ralfa Browna) pokazuje, że przerwania 10h i 13h są zdefiniowane przez BIOS odpowiednio dla usług wideo i dyskowych. Czy jest coś, czego mi brakuje, czy te adresy przerwań są używane jednocześnie do przerwań sprzętowych i programowych?
Odpowiedzi
Podczas gdy dokumentacja procesora 8088 używanego w oryginalnym IBM PC zarezerwowała pierwsze 32 wektory przerwań dla wyjątków procesora, procesor 8088 wykorzystał tylko kilka z nich. Kiedy IBM zaprojektował komputer PC, zdecydował się to zignorować i przypisał zarezerwowane, ale nieużywane wektory do własnych celów.
Oryginalny 8088 zdefiniował tylko wyjątki dla pierwszych 5 wektorów przerwań, odpowiednio dla błędu dzielenia, pojedynczego kroku, NMI, punktu przerwania i przepełnienia. Wektory przerwań od 5 do 31 zostały oznaczone jako zastrzeżone w podręczniku użytkownika rodziny 8086 firmy Intel:
Mimo to IBM zdecydował się skonfigurować BIOS kontrolera przerwań tak, aby dostarczał przerwania sprzętowe począwszy od wektora przerwań 8. Ponieważ oryginalny IBM PC obsługiwał tylko 8 przerwań sprzętowych, oznaczało to, że wektory od 8 do 15 były używane do przerwań sprzętowych. Następnie IBM zaczął przypisywać usługi BIOS, zaczynając od wektora 16 (10h), które miały być wywoływane za pomocą przerwań programowych. Ponadto wektor 5 został użyty do zaimplementowania funkcji print screen. Zarezerwowane wektory 6 i 7 nie zostały użyte.
Niestety okazało się to błędem IBM, ponieważ kiedy Intel zaprojektował 80286, zdefiniowali dodatkowe wyjątki procesora w zarezerwowanym zakresie, sięgając aż do wektora 13 (0Dh). Oznaczało to, że IBM PC / AT, który używał procesora 80286, ale musiał być również wstecznie kompatybilny z oryginalnym IBM PC opartym na 8088, miał wektory przerwań o dwóch różnych celach, jednym zdefiniowanym przez procesor, a drugim przez BIOS.
W szczególności posiadanie zarówno ekranu wydruku, jak i BOUNDwyjątku naruszenia przy użyciu wektora 5 okazało się dość dużym uciążliwością. Teoretycznie nie powinno to stanowić problemu, ponieważ każdy program korzystający z nowej BOUNDinstrukcji musiałby zainstalować własną procedurę obsługi przerwań, taką, która mogłaby rozróżniać oba źródła. W praktyce jednak BOUNDinstrukcja kończyła się niezamierzonym wykonaniem przez programy, które uległy awarii, a domyślny program obsługi BIOS utknął w nieskończonej pętli drukowania ekranu.
Inne sprzeczne zastosowania wektorów nie stanowiły większego problemu, ponieważ wyjątki od 10 do 13 byłyby normalnie generowane tylko w trybie chronionym. System operacyjny w trybie chronionym nie musiał być kompatybilny wstecz i nie mógł korzystać z BIOS-u, więc mógł rekonfigurować kontroler przerwań, aby dostarczał przerwania sprzętowe przez wektory spoza zarezerwowanego zakresu.
Pozostałe wyjątki CPU zdefiniowane przez późniejszy procesor Intela albo też nie były normalnie generowane przez kod trybu rzeczywistego, który musiał być wstecznie kompatybilny, albo były obsługiwane przez domyślne programy obsługi BIOS-u, które potrafiły prawidłowo rozróżniać źródła.
W oryginalnej architekturze PC / AT sygnał wyjątku FPU, który powinien być podłączony bezpośrednio do dedykowanego pinu wejściowego na głównym procesorze i powinien pojawić się, gdy INT 10h jest przekierowywany przez logikę kleju do drugiego kontrolera IRQ, tak że pojawia się jako IRQ 13 (tj. INT 75h) zamiast tego. Większość innych wektorów będących w konflikcie ma taki charakter, że wektory zdefiniowane sprzętowo są interesujące tylko w trybie chronionym, a wektory zdefiniowane w systemie BIOS tylko w trybie rzeczywistym, więc zwykle nie będzie prawdziwego konfliktu. Zasadniczo chodzi o to, że inżynierowie IBM robią coś inaczej, niż zamierzali inżynierowie Intela.