Ponieważ jest to prezentacja o BIOS-ie zostaną tu przedstawione tylko przerwania BIOS-u. Dziś już nie są one używane przez nowoczesne systemy operacyjne, takie jak Linux. Powodów po temu jest kilka:
Wymienione systemy korzystają z własnych przerwań, których idea jest dokładnie tak sama jak w przypadku przerwań BIOS-u.
Przerwanie jest sygnałem informującym procesor o zajsciu pewnego zdarzenia (np: naciśnięcie klawisza), które powinno być obsłużone. Procesor zaczyna wykonywać kod mający obsłużyć dane zdarzenia. Kod ten nazywamy procedurą oblsugi przerwania.
Podczas startu systemu, BIOS inicjuje tzw.: tablicę wektorów przerwań, która zawiera informacje o adresach procedur obsługi przerwań. Jest ona zbiorem 256 dalekich wskaźników (nazywanych wektorami) i umieszczona jest w pamieci pod adresem 00:00h (czyli sam początek pamieci RAM).
Oto zawartosc omawianej tablicy dla komputerów PC:
Przerwanie | Położenie wektora | Typ | Zadanie |
---|---|---|---|
00h | 0000:0000h | PROCESOR | Błąd dzielenia przez zero |
01h | 0000:0004h | PROCESOR | Przerwanie pracy krokowej |
02h | 0000:0008h | SPRZĘT | NHI/błąd koprocesora |
03h | 0000:000Ch | PROCESOR | Zatrzymanie programu |
04h | 0000:0010h | PROCESOR | Nadmiar arytmetyczny |
05h | 0000:0014h | BIOS | Wydruk ekranu |
SPRZĘT | Przekroczenie wartości granicznych | ||
06h | 0000:0018h | PROCESOR | Niepoprawny kod operacji |
07h | 0000:001Ch | PROCESOR | Brak koprocesora |
08h | 0000:0020h | PROCESOR | Podwójny błąd |
SPRZĘT | IRQ0: timer systemowy | ||
09h | 0000:0024h | PROCESOR | Przepełnienie stosu koprocesora |
SPRZĘT | IRQ1: klawiatura | ||
0Ah | 0000:0028h | PROCESOR | Nieważny TSS |
SPRZĘT | Symulowany IRQ2 | ||
0Bh | 0000:002Ch | PROCESOR | Brak segmentu |
SPRZĘT | IRQ3: drugi port szeregowy | ||
0Ch | 0000:0030h | PROCESOR | Przepełnienie segmentu stosu |
SPRZĘT | IRQ4: pierwszy port szeregowy | ||
0Dh | 0000:0034h | PROCESOR | Ogólny błąd ochrony |
SPRZĘT | IRQ5: sterownik HDD | ||
0Eh | 0000:0038h | SPRZĘT | IRQ6: sterownik FDD |
0Fh | 0000:003Ch | SPRZĘT | IRQ7: port równoległy |
10h | 0000:0040h | BIOS | Funkcje BIOS-u karty graficznej |
11h | 0000:0044h | BIOS | Określenie wyposażenia |
12h | 0000:0048h | BIOS | Określenie wielkości pamięci podstawowej |
13h | 0000:004Ch | BIOS | Funkcje BIOSu FDD i HDD |
14h | 0000:0050h | BIOS | Funkcje BIOSu portów szeregowych |
15h | 0000:0054h | BIOS | Funkcje obsługi systemu i rozszerzenia BIOS-u |
16h | 0000:0058h | BIOS | Funkcje BIOSu obsługi klawiatury |
17h | 0000:005Ch | BIOS | Funkcje BIOSu obsługi drukarki |
18h | 0000:0060h | BIOS | Procedura obsługi awarii przy starcie komputera |
19h | 0000:0064h | BIOS | Procedura załadowania sektora startowego |
1Ah | 0000:0068h | BIOS | Obsługa timera i zegara czasu rzeczywistego |
1Bh | 0000:006Ch | BIOS | Obsługa Ctrl-Break |
1Ch | 0000:0070h | BIOS | Obsługa licznika systemowego |
1Dh | 0000:0074h | WSKAŹNIK | Tabela parametrów sterownika karty graficznej |
1Eh | 0000:0078h | WSKAŹNIK | Tabela parametrów FDD |
1Fh | 0000:007Ch | WSKAŹNIK | Zestaw znaków karty graficznej |
20h-3Fh | 0000:0080h | Zarezerwowane | |
40h | 0000:0100h | BIOS | Alterenatywny wektor funkcji BIOSu dyskietki |
41h | 0000:0104h | WSKAŹNIK | Tabela paramterów HDD |
42h | 0000:0108h | BIOS | Domyśliny sterownik karty graficznej EGA |
43h | 0000:0110h | WSKAźNIK | Zestaw znaków karty graficznej |
44h-45h | 0000:0110h | Zarezerwowane | |
46h | 0000:0118h | WSKAŹNIK | Tablea prametrów HDD |
47h-49h | 0000:011Ch | Zarezerwowane | |
4Ah | 0000:0128h | BIOS | Obsługa alarmu zegara czasu rzeczywistego |
4Bh-4Fh | 0000:012Ch | Zarezerwowane | |
60h-67h | 0000:0180h | Przerwania programów użytkownika | |
68h-6Fh | 0000:01A0h | Zarezerwowane | |
70h | 0000:01C0h | SPRZĘT | IRQ8: zegar czasu rzeczywistego |
71h | 0000:01C4h | SPRZĘT | IRQ9: skierowane z IRQ2 |
72h | 0000:01C8h | SPRZĘT | IRQ10 |
73h | 0000:01CCh | SPRZĘT | IRQ11 |
74h | 0000:01D0h | SPRZĘT | IRQ12: interfejs myszy |
75h | 0000:01D4h | SPRZĘT | IRQ13: błąd koprocesora |
76h | 0000:01D8h | SPRZĘT | IRQ14: sterownik HDD |
77h | 0000:01DCh | SPRZĘT | IRQ15 |
78h-7Fh | 0000:01E0h | Zarezerwowane | |
80h-F0h | 0000:0200h | Zarezerwowane | |
F1h-FFh | 0000:03C4h | Przrwania programów użytkownika |
Wywołując przerwanie musimy podać numer funkcji, która ma zostać wykonana. Robi się to wpisując do rejestru AX nazwę interesującej nas funkcji. W pozostałych rejestrach należy podać parametry wywoływanej funkcji.
Oto opis funkcji poszczególnych przerwań BIOSu:
Nr przerwania | Nr funkcji | Opis funkcji |
---|---|---|
05h | Obsługuje klawisz Print Screen | |
10h | 00h | Ustawia tryb karty graficznej |
01h | Ustawia rozmiar kursora | |
02h | Ustawia pozycję kursora | |
03h | Odczytuje pozycję kursora | |
04h | Odczytanie pozycji pióra świetlnego | |
05h | Ustawia aktywną stronę | |
06h | Przewija stronę do góry | |
07h | Przewija stronę w dół | |
08h | Odczytuje znak i atrybut | |
09h | Pisze znak wraz z atrybutem | |
0Ah | Pisze tylko znak | |
0Bh | Ustawia paletę barw | |
0Ch | Rysuje piksel | |
0Dh | Odczytuje piksel | |
0Eh | Pisze znak i przesuwa kursor | |
0Fh | Podaje tryb pracy karty graficznej | |
13h | Pisze tekst | |
1A00h | Odczytanie kodów kart graficznych | |
11h | Podaje informację o zamontowanym wyposażeniu | |
12h | Podaje wielkość pamięci podstawowej | |
13h | 00h | Reset napędu (FDD lub HDD) |
01h | Stan zakończenia ostatniej operacji IO | |
02h | Czyta sektory | |
03h | Zapisuje sektory | |
04h | Weryfikuje sektory | |
05h | Formatuje ścieżkę | |
08h | Podaje parametry dysku | |
09h | Inicjalizuje parametry dysku | |
0Ah | Czyta długie sektory | |
0Bh | Zapisuje długie sektory | |
0Ch | Idzie do cylindra | |
0Dh | Alternatywny reset dysku | |
10h | Sprawdzenie gotowości dysku | |
11h | Rekalibracja dysku | |
12h | Wykonuje diagnosykę RAM | |
13h | Wykonanie diagnostyki sterownika | |
14h | Podaje typ stacji FDD | |
15h | Podaje typ HDD | |
16h | Sprawdza stan linii zmiany nośnika FDD | |
17h | Ustawia typ dyskietki do formatowania (FDD) | |
18h | Ustawia typ nośnika do formatowania (HDD) | |
19h | Parkuje głowicę (HDD) | |
14h | 00h | Inicjalizuje port szeregowy |
01h | Wysyła znak przez port szeregowy | |
02h | Odbiera znak przez port szeregowy | |
03h | Podaje stan portu szeregowego | |
04h | Rozszerzona inicjalizacja portu szeregowego | |
05h | Rozszerzone sterowanie modemem | |
15h | 4Fh | Przechwycenie naciśnięcia klawisza |
80h | Przechwycenie otwarcia połączenia | |
81h | Przechwycenie zamkniecia połączenia | |
82h | Przechwycenie zakończenia procesu | |
83h | Ustawia/kasuje timer | |
84h | Podaje stan joysticka | |
85h | Obsluga klawisza SysRq | |
86h | Bezwarunkowe oczekiwanie | |
87h | Przesunięcie blokowe | |
88h | Podaje wielkość pamięci rozszerzonej | |
89h | Przełączenie na tryb chroniony | |
90h | Oczekiwanie na urządzenie | |
91h | Przerwania zakończenia | |
C0h | Podaje informacje o środowisku pracy | |
C1h | Podaje segment rozszerzonego BDA | |
C200h | Włącza/wyłącza mysz PDI | |
C201h | Resetuje mysz PDI | |
C202h | Ustawia częstotliwość próbkowania myszy PDI | |
C203h | Ustawia częstotliwość myszy PDI | |
C204h | Podaje typ myszy PDI | |
C205h | Inicjalizuje mysz PDI | |
C206h | Pobranie/ustawienie skalowania myszy PDI | |
C207h | Ustawia adres sterownika myszy PDI | |
D800h | Podaje informacje o gnieździe EISA | |
D801h | Podaje informacje o funkcjach | |
D802h | Wymazuje konfigurację | |
D803h | Zapisuje konfigurację | |
16h | 00h | Odczytuje znak z klawiatury |
01h | Sprawdza czy są gotowe dane z klawiatury | |
02h | Podaje stan klawiatury | |
03h | Ustawienia szybkości klawiatury | |
05h | Zapisuje znak do bufora klawiatury | |
10h | Odzczytuje znak z klawiatury rozszerzonej | |
11h | Sprawdza czy są gotowe dane z klawiatury rozszerzonej | |
12h | Podaje stan klawiatury rozszerzonej | |
17h | 00h | Drukuje znak |
01h | Inicjalizuje port drukarki | |
02h | Pobiera słowo stanu drukarki | |
1Ah | 00h | Podaje stan licznika systemowego |
01h | Ustawia stan licznika systemowego | |
02h | Podaje stan zegra RTC | |
03h | Ustawia czas RTC | |
04h | Podaje datę RTC | |
05h | Ustawia datę RTC | |
06h | Ustawia alarm RTC | |
07h | Resetuje alarm RTC | |
1Ch | Obsługa systemowego sygnału zegarowego |
Jak wcześniej już napisałem, Linux nie korzysta z przerwań BIOS-u (wyjątkiem jest tylko start i zakończenie pracy systemu). Przechodząc do trybu chronionego inicjuje on własną tablicę przerwań, do której wskaźnik znajduje sie w rejstrze idtr.
Wyjątki, o których napisałem wyżej, występują w LILO i funkcji setup(). Np. LILO wyświetlając "Loading" korzysta z przerwania BIOS-u, a funkcja setup() (znajdująca sie pod adresem 0x00090200) używając BIOS-u otrzymuje informacje ozainstalowanej pamięci w komputerze.