|
Programowanie Biosu
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:
* bardzo proste sterowniki kart graficznych (wyświetlanie komunikatów
diagnostycznych, logo)
* sterowniki dysków twardych
* sterowniki stacji dysków
* sterowniki stacji CD-ROM
* sterownik klawiatury
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.
Autor: Filip Noworyta
D.F.
|