Programowanie BIOSu


Wstęp

Za co odpowiada BIOS?

BIOS odpowiada zazwyczaj za komunikację między programem a urządzeniami. Udostępnia on zazwyczaj swój interfejs i umożliwia dostęp do sprzętu bez bezpośredniego odwoływania się do niego.

BIOS zawiera sterowniki najczęściej używanych urządzeń, na przykład:

Ponieważ BIOS oferuje większą abstrakcję niż "goły" komputer, używanie jego funkcji w swoich programach gwarantowało kiedyś ich większą przenośność. Dziś system operacyjny komunikuje się raczej bezpośrednio z urządzeniami, by mieć nad nimi większą kontrolę i większy wpływ na szybkość wykonywanych operacji, a programy użytkownika nie korzystają w trybie chronionym z możliwości BIOSu.

Jak BIOS udostępnia swoje funkcje systemowi?

BIOS zmienia kilka pozycji w tablicy przerwań wstawiając tam wskaźniki do swoich funkcji. Następnie system operacyjny (lub program, jeżeli system umożliwia wykonywanie przerwań, jak w systemie DOS) wywołuje przerwanie o określonym numerze (int 0xNUMER). W rejestrach ogólnego przeznaczenia przekazywane są parametry funkcji. BIOS wykonuje funkcję i wraca wykonując instrukcję procesora IRET.

Dane BIOSu - Bios Data Area

Bios trzyma swoje zmienne w specjalnym obszarze pamięci od adresu 0040:0000. Zmienne te można zarówno odczytywać jak i modyfikować. Wywołania funkcji BIOSu mogą powodować ich zmianę, co należy brać pod uwagę przy pisaniu programów zapisujących tam wartości.

W poniższej tabeli znajdują się przykładowe przesunięcia względem adresu 0040:0000 oraz ich znaczenia.

Przesunięcie Znaczenie
0x0000 Adresy wejścia/wyjścia dla portów szeregowych
0x0008 Adresy wejścia/wyjścia dla portów równoległych
0x0017 Słowo zawierające stan klawiatury
0x001A Początek bufora klawiatury
0x001C Koniec bufora klawiatury
0x001E Bufor klawiatury (32 bajty)
0x003F Jeden bajt - stan silników stacji dysków
0x004E Początek obrazu ekranu w pamięci karty graficznej
0x006B Ostatnie przerwanie sprzętowe, np. bit 5 ustawiony na 1
oznacza wystąpienie przerwania IRQ 5,
0x0074 Stan ostatniej operacji dyskowej (po int 0x13), np. 0x4 to
błąd "sektor nie istnieje"
0x0075 Ilość twardych dysków w systemie
0x0078 Przekroczenie czasu oczekiwania w porcie równoległym numer 1
0x008B Bajt konfiguracji stacji dysków, np. bity 7-6 oznaczaja predkosc przesyłu danych do kontrolera (np. 00 - 500 Kbit/sek, 01 - 300 Kbit)
0x008C Bajt stanu kontrolera twardego dysku
0x0096 Flagi stanu klawiatury, np. bit 3 jest równy 1, gdy wciśnięto
prawy klawisz Alt
0x0097 Flagi stanu klawiatury, bit 2 to zapalona dioda Caps Lock, bit 1 to
dioda Num Lock, bit 0 to dioda Scroll Lock, bit 7 to błąd przesyłu z klawiatury

Przerwania BIOSu

Tablica przerwań znajduje się w pamięci operacyjnej na początku pamięci (pod adresem 0) i zajmuje jeden kilobajt. Jest tam 256 wskaźników do funkcji wywoływanych przez przerwania programowe. Każdy wskaźnik zajmuje cztery bajty. Tak jest oczywiście tylko w trybie rzeczywistym.

Poniżej znajduje się tabela z listą przerwań BIOSu.

Numer
przerwania
Opis
przerwania
0x0 Przerwanie dzielenia przez zero
0x1 Praca krok po kroku
0x2 Non-maskable interrupt (przerwanie niemaskowalne)
0x3 Trap (pułapka), przydatne przy odpluskwianiu
0x4 Nadmiar
0x5 PrintScreen (Drukowanie ekranu)
0x6 Zarezerwowane
0x7 Zarezerwowane
0x8 IRQ 0 - zegar systemowy
0x9 IRQ 1 - klawiatura
0xA IRQ 2 - zarezerwowane
0xB IRQ 3 - łącze szeregowe 2
0xC IRQ 4 - łącze szeregowe 1
0xD IRQ 5 - łącze równoległe 2
0xE IRQ 6 - sterownik dyskietek
0xF IRQ 7 - łącze równoległe 1
0x10 Karta graficzna
0x11 Do odczytu konfiguracji
0x12 Wielkość pamięci konwencjonalnej
0x13 Przerwanie do obsługi dysków twardych
0x14 Port szeregowy
0x15 Inne funkcje
0x16 Funkcje klawiatury
0x17 Funkcje drukarki
0x18 Wywołanie ekranu konfiguracyjnego BIOSu
0x19 Ładowanie systemu operacyjnego
0x1A Funkcje dotyczące zegara
0x1B Przerwanie Ctrl+Break
0x1C Przerwanie zegara czasu rzeczywistego
0x1D Ustawienia sterownika graficznego
0x1E Ustawienia napędu stacji dysków
0x1F Wskaźnik na tablicę rozszerzonych znaków ASCII

Jak widać, przy pomocy funkcji BIOSu można całkiem dużo zrobić. Całkiem ciekawym zastosowaniem jest programowanie karty VGA - jest to proste, a napisane dla niej programy zadziałają na dowolnym komputerze (uruchomione w trybie rzeczywistym, bo w chronionym zazwyczaj nie ma dostępu do funkcji BIOSu). Oto przykład programu przełączającego kartę VGA w tryb 320x200:

 mov ax, 0x13
 int 0x10

Później wystarczy jedynie ustawić paletę kolorów i umieszczać wartości w pamięci karty graficznej od adresu 0xA000. Jest to bardzo wygodne i działa z każdą kartą VGA. Z tego powodu powstało wiele programów i gier wykorzystujących tę funkcję BIOSu.


[Wstecz]  [Dalej]  [Główna]