Programowanie Biosu


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ęcieZnaczenie
0x0000Adresy wejścia/wyjścia dla portów szeregowych
0x0008Adresy wejścia/wyjścia dla portów równoległych
0x0017Słowo zawierające stan klawiatury
0x001APoczątek bufora klawiatury
0x001CKoniec bufora klawiatury
0x001EBufor klawiatury (32 bajty)
0x003FJeden bajt - stan silników stacji dysków
0x004EPoczątek obrazu ekranu w pamięci karty graficznej
0x006BOstatnie przerwanie sprzętowe, np. bit 5 ustawiony na 1
oznacza wystąpienie przerwania IRQ 5,
0x0074Stan ostatniej operacji dyskowej (po int 0x13), np. 0x4 to błąd "sektor nie istnieje"
0x0075Ilość twardych dysków w systemie
0x0078Przekroczenie czasu oczekiwania w porcie równoległym numer 1
0x008BBajt konfiguracji stacji dysków, np. bity 7-6 oznaczaja predkosc przesyłu danych do kontrolera (np. 00-500 Kbit/sek, 01-300 Kbit)
0x008CBajt stanu kontrolera twardego dysku
0x0096Flagi stanu klawiatury, np. bit 3 jest równy 1, gdy wciśnięto prawy klawisz Alt
0x0097Flagi 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
0x0Przerwanie dzielenia przez zero
0x1Praca krok po kroku
0x2Non-maskable interrupt (przerwanie niemaskowalne)
0x3Trap (pułapka), przydatne przy odpluskwianiu
0x4Nadmiar
0x5PrintScreen (Drukowanie ekranu)
0x6Zarezerwowane
0x7Zarezerwowane
0x8IRQ 0 - zegar systemowy
0x9IRQ 1 - klawiatura
0xAIRQ 2 - zarezerwowane
0xBIRQ 3 - łącze szeregowe 2
0xCIRQ 4 - łącze szeregowe 1
0xDIRQ 5 - łącze równoległe 2
0xEIRQ 6 - sterownik dyskietek
0xFIRQ 7 - łącze równoległe 1
0x10Karta graficzna
0x11Do odczytu konfiguracji
0x12Wielkość pamięci konwencjonalnej
0x13Przerwanie do obsługi dysków twardych
0x14Port szeregowy
0x15Inne funkcje
0x16Funkcje klawiatury
0x17Funkcje drukarki
0x18Wywołanie ekranu konfiguracyjnego BIOSu
0x19Ładowanie systemu operacyjnego
0x1AFunkcje dotyczące zegara
0x1BPrzerwanie Ctrl+Break
0x1CPrzerwanie zegara czasu rzeczywistego
0x1DUstawienia sterownika graficznego
0x1EUstawienia napędu stacji dysków
0x1FWskaź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.



Copyright © by MiniMax 1997/2007. All rights reserverd!