Czy BIOS jest małym systemem operacyjnym?

18.12.2003
Elżbieta Iwaszkiewicz
Małgorzata Zalewska
Piotr Korba Tomczyk

  1. Początek
    1. Definicje BIOS-u
    2. Gdzie jest przechowywany BIOS?
    3. Jaki jest BIOS?
  2. Zadania BIOS-u
  3. Funkcje początkowe
  4. Przerwania w BIOS-ie
    1. Jak to działa?
    2. Punkty wejścia
    3. Ogólnie o funkcjach
    4. Bootowanie systemu
    5. Określenie wersji BIOS-u
    6. Określenie typu PC
    7. Funkcje wyświetlania wyjścia
    8. Określenie konfiguracji systemu
    9. Określenie dostępnego RAM-u
    10. Dostęp do dysku z BIOS-u
    11. Dostęp do twardego dysku z BIOS-u
    12. Pamięć CMOS
    13. Dostęp do szeregowych portów z BIOS-u
    14. Dostęp do klawiatury z BIOS-u
    15. Dostęp do drukarki z BIOS-u
    16. Dostęp do danych i czasu z BIOS-u
  5. Magazynowanie danych
  6. System zabezpieczeń w BIOS-ie
  7. BIOS dzisiaj
    1. BIOS się rozwija
    2. Czy BIOS to przeszłość?
  8. Jeśli nie BIOS, to co?
  9. Ograniczenia BIOSu
  10. LinuxBIOS - system ładuje system
  11. Struktura i działanie Linux BIOSu
    1. Przejście do trybu chronionego
    2. Konfiguracja DRAMu
    3. Inicjalizacja płyty głównej
    4. Dekompresja i uruchomienie jądra
  12. Po starcie LinuxBIOSu
    1. Standardowo
    2. Po kablu
    3. Bez dysku
  13. Zdalne zarządzanie LinuxBIOSem
  14. Podsumowanie
  15. Słownik użytych pojęć
  16. Bibliografia

Początek

Definicje BIOS-u

BIOS, czyli Basic Input/Output System, jest elektronicznym odpowiednikiem rozrusznika do kosiarki - starej technologii, która jest potrzebna do uruchomienia komputera, ale nie używana ponownie przed następnym włączeniem. BIOS jest odpowiedzialny za kontrolę odpowiedniego dopasowania konfiguracji do konkretnego komputera. Jest właściwie zwykłym programem, zbiorem instrukcji, które mówią mikroprocesorowi, co ma robić. Tym, co go wyróżnia, jest sposób jego przechowywania oraz funkcje, które oferuje.

BIOS jest wbudowanym oprogramowaniem, który wyznacza możliwości, jakie ma komputer, gdy nie używa programów przechowywanych na dysku. Na PC-cie BIOS zawiera kod odpowiedzialny za kontrolę klawiatury, monitora, sterowników urządzeń, portów komunikacyjnych i wiele rozmaitych funkcji.

BIOS jest najbardziej niskopoziomowym oprogramowaniem na komputerze. Stanowi interfejs pomiędzy sprzętem oraz systemem operacyjnym. Dzięki niemu mamy możliwość dostępu do sprzętu oraz korzystania z oprogramowania wyższego poziomu.

W niektórych źródłach BIOS nazywany jest nawet systemem operacyjnym. W dzisiejszej prezentacji spróbujemy odpowiedzieć na pytanie, do jakiego stopnia to stwierdzenie jest słuszne.

Gdzie jest przechowywany BIOS?

BIOS, w przeciwieństwie do innych programów, jest stałą częścią komputera. Nie jest ładowany z dysku, lecz znajduje się na płycie głównej, w stałej pamięci: ROM (Read-Only Memory). Teraz właściwie nie używa się do tego pamięci ROM, tylko EEPROM (głównie Flash). Ta stosowana powszechnie technologia nie wymaga już skomplikowanych urządzeń wypalających i kasujących. Kod BIOS-u różni się od zwykłego oprogramowania tym, że jest integralną częścią komputera, definiującą, co i jak komputer może robić. Jest to specyfikacja sprzętowa dopasowana do konkretnego komputera. Jest stworzona po to, aby uruchomić system operacyjny.

BIOS jest przechowywany w przestrzeni procesora zaadresowanej od F0000h do FFFFFh. Sam również musi przechowywać różnego rodzaju zmienne i robi to w dolnej części pamięci, startując od adresu 0040h:0000h.

Jaki jest BIOS?

BIOS jest zmieniany, ale nieznacznie. Nawet w najnowszych PC-tach jego kod opiera się na BIOS-ie z pierwszego komputera osobistego firmy IBM, stworzonego w 1981 roku.

Jako program startujący, jest on aktywny przez krótki czas. Gdy załaduje się już system operacyjny, większa część BIOS-u nie jest już używana (aż do następnego ładowania). Jednak część BIOS-u jest używana do programowania/kontrolowania niskopoziomowych funkcji urządzeń i do interakcji z urządzeniami systemowymi do kontroli zasilania/energii.

Zadania BIOS-u

Początkowo BIOS miał 4 funkcje. Upewniał się, czy komputer był w stanie umożliwiającym działanie sprawdzając obwody elektryczne za każdym razem, gdy był ładowany. Funkcję tę nazywa się POST (Power-On Self-Test). Po załadowaniu, BIOS kontrolował podstawowe operacje w systemie, zapewniając, że pamięć dynamiczna była poprawnie odświeżona (teraz jest to wykonywane przez chipsety lub chip pamięci, a BIOS dostarcza parametry odświeżania pamięci) oraz zajmował się cyklicznymi funkcjami zarządzającymi pracą systemu (systemu rozumianemu jako sprzęt).

Po załadowaniu BIOS rezerwował małe bloki RAMu nazywane przestrzenią danych BIOS-u (BIOS Data Area). Były tam przechowywane informacje, do których, jako do istotnych szczegółów konfiguracji systemu (znowu: sprzętu), mogły odwoływać się programy. Służył także do łączenia oprogramowania (w tym też systemu operacyjnego) ze sprzętem. Ta ostatnia funkcja podkreśla nazwę BIOS-u. Był to prosty system, który zapewniał operacje wejścia - wyjścia dla komputera i urządzeń peryferyjnych.

Dziś sprzęt oraz urządzenia peryferyjne są generalnie obsługiwane przez system operacyjny i sterowniki urządzeń, choć BIOS pomaga w niskopoziomowej inicjalizacji chipsetów przy uruchamianiu systemu.

Główne zadanie BIOS-u w fazie uruchamiania komputera polega na sprawdzeniu podstawowych bloków funkcjonalnych architektury PC. Po przekazaniu sterowania do systemu operacyjnego BIOS odwzorowuje dowolną płytę główną w formie jednolitego zestawu kanałów komunikacyjnych. Część kodu poświęcona jest na stworzenie prostego interfejsu tekstowego umożliwiającego wprowadzanie przez użytkownika pewnych parametrów konfiguracyjnych (BIOS-SETUP).

Funkcje początkowe

Mikroprocesor musi być poinformowany, co ma robić: jak sprawdzić siebie, jak sprawdzić resztę systemu, jak zainicjować pamięć, DMA itd. Procedury kontrolne POST sprawdzają obecność podstawowych członów architektury PS oraz dokonują elementarnych testów poprawności ich funkcjonowania. Gdy wyniki prób są pomyślne, algorytm przechodzi do dalszych kroków, polegających na ustawianiu poszczególnych rejestrów konfiguracyjnych. Jeżeli jednak wykryto błędy, program zatrzymuje swój bieg. Dla zasygnalizowania przyczyny błędu nie można się jednak posłużyć monitorem (karta graficzna nie jest jeszcze w tym momencie skonfigurowana). Pracuje natomiast głośnik i to on właśnie stanowi kanał informacyjny. BIOS kieruje do niego określoną sekwencję sygnałów akustycznych, których rozszyfrowanie umożliwiają listy przyporządkowujące.

Po zakończeniu POST i procedur inicjalizacyjnych, BIOS oddaje kontrolę systemowi operacyjnemu. Większość z nich jest ładowana z dysku (choć niektóre komputery sieciowe mogą otrzymać kod systemu operacyjnego przez sieć). Zatem BIOS musi wiedzieć skąd ma wziąć kod systemu, aby go załadować do pamięci, czyli posiadać wystarczającą wiedzę na temat dyskietki, dysku twardego i CD (lub sieci). Proces, który powoduje załadowanie systemu, nazywa się IPL (initial program load). Jego początki były dość skromne, lecz w dzisiejszych czasach system wybiera któreś z urządzeń (dysk, karta PC) i używa BIOS-u jako interfejsu sprzętowego.

Przerwania w BIOS-ie

Jak to działa?

Obsługa BIOS-u nabiera kształtów w przerwaniach systemowych. Aby aktywować funkcje urządzeń zewnętrznych, program ładuje rejestr z numerem przerwania, a następnie wydaje instrukcje przerwania (INT).

Przerwanie mówi procesorowi, żeby spojrzał na pozycję związaną z przerwaniem w tablicy przerwań. Procesor skacze pod wskazane miejsce, aby znaleźć zbiór instrukcji przydzielony do tego przerwania i wykonuje je. Jeżeli system potrzebuje przekazać jakieś dane do urządzeń zewnętrznych, wartości danych są ładowane do innego rejestru, zanim instrukcja przerwania będzie wywołana. Kod BIOS-u czyta dane z rejestru.

Kiedy funkcja obsługi przerwania jest zakończona, wykonywana jest specjalna instrukcja powrotu z przerwania, która zdejmuje ze stosu zachowane flagi i adres programu i wkłada je do odpowiednich rejestrów. Następnie procesor powraca do oryginalnego kodu programu po instrukcji INT. Program czyta wyniki funkcji obsługi przerwania (jeśli jest to potrzebne) z rejestrów procesora. Jeden z rejestrów zawiera informacje, czy obsługa przerwania zakończyła się właściwie, czy z błędem, oznaczonym jako "wyjściowy kod błędu".

Punkty wejścia

Część programistów wolała unikać używania przerwań systemowych i pisała swoje programy, skacząc bezpośrednio do początku sekwencji kodu przypisanego do danego przerwania. Taki punkt początkowy kodu jest zwany punktem wejścia BIOS-u entry points. Żeby zapewnić zgodność z programami, które skaczą bezpośrednio do punktów wejścia (a więc naruszają zasady BIOS-u), twórcy BIOS-u byli zmuszeni do zrobienia punktów wejścia w ten sam sposób, jak w oryginalnym BIOS-ie w IBM PC. Przez lata inżynierowie dodawali nowe usługi BIOS-u, aby obsłużyć nowe właściwości urządzeń takie jak zarządzanie mocą i opcje Plug-and-Play. Oryginalny obszar pamięci wyznaczony dla BIOS-u był nieadekwatny w stosunku do rozmiaru całego potrzebnego kodu programu, więc jego twórcy dodali więcej ROM-u aby utrzymać większy porządek. Zaczęli także specyfikować punkty wejścia zamiast używania nowych przerwań dla nowych funkcji.

Ogólnie o funkcjach

Funkcje BIOS-u polegają na indywidualnym wywołaniu poprzez przerwania od 10H do 17H i 1AH. Używanie funkcji jest standardowe, przesyłanie danych od wywołującego procesu do przerwania i z przerwania do procesu.


Przerwania i ROM-BIOS

Bootowanie systemu

Proces bootujący systemu operacyjnego zaczyna się od sprawdzenia pierwszej sekcji dyskietki lub twardego dysku, która jest ładowana do pamięci. Od czasu kiedy włączymy komputer do czasu kiedy jest bootowany do pamięci, ma miejsce ciąg zdarzeń, które teraz omówię:

Określenie wersji BIOS-u

Zazwyczaj 5 bajtów instrukcji długiego skoku, od której system zaczyna można znaleźć na miejscu: F000h:FFF0h w pamięci. Po tej instrukcji jest 11 bajtów, które zazwyczaj są używane do pamiętania informacji o wersji BIOS-u. Możemy sprawdzić tę cześć pamięci, aby zobaczyć, której wersji BIOS-u używa PC. Wywołując DEBUG program z DOS-u:

C> debug -dF000:FFF0
F000:FFF0 CD 19 E0 00 F0 31 31 2F-32 36 2F 39 36 00 FC F9 ....11/24/03...

Określenie typu PC

Używanie pewnych funkcji BIOS-u jest bardziej dla identyfikacji modelu niż identyfikacji wersji BIOS-u. Wskazują one typ używanego PC. One także wskazują jeśli BIOS ma dodatkowe funkcje tj. dostęp do zegara czasu rzeczywistego i dodatkowego RAM-u poza limitem 1 MB pamięci. Bajtowa identyfikacja modelu jest umieszczona na ostatnim miejscu w pamięci ROM-BIOS-u pod adresem F000h:FFFE

Funkcje wyświetlania wyjścia

BIOS zawiera serię funkcji, które wyświetlają dane na ekranie i zawierają inne funkcje wyświetlania. Dodatkowo dla trybu video, BIOS zarządza pozycją kursora, tekstowego wyjścia i graficznego wyświetlania funkcji. Przerwanie 10H wywołuje te funkcje. Rejestry procesora przenoszą dane pomiędzy programem aplikacji i funkcjami przerwania BIOS-u.

Funkcje BIOS-u oferują programiście niezależność od poszczególnych kart video. Producenci PC próbują dostosować ROM-BIOS do nowych kart graficznych przez pakiet niezależnego ROM-BIOS-u na nich. Kiedy system jest bootowany, BIOS wykrywa rozszerzenie ROM i pozwala jemu przekierowywać przerwania BIOS video 16h jego własnemu wykonaniu, zastępując stare funkcje. Następująca tabela zawiera funkcje przerwania 10h.

Numer funkcji Działanie
00h Ustawienie trybu video
0Fh Odczytanie trybu video
Tryb tekstowy
02h Ustawienie pozycji kursora
03h Odczytanie pozycji kursora
01h Ustawienie rozmiaru kursora
05h Zmiana aktywnej strony
09h Wypisanie znaku z atrybutami
0Ah Wypisanie znaku
08h Odczytanie znaku lub atrybutóu
06h Przesunięcie okna do góry
07h Przesunięcie okna do dołu
Funkcje graficzne
0Bh Ustawienie palety kolorów
0Dh Odczytanie koloru piksela
13h Zapalenie piksela
Funkcje trybów EGA/VGA
10h Ustawienie palety kolorów
12h Sprawdzenie zainstalowanej karty EGA/VGA
13h Wypisanie łańcucha znaków
1Bh Odczytanie stanu karty
1Ch Odczytanie / ustawienie trybu video

Określenie konfiguracji systemu

Informacje o systemie są zdobywane za pomocą przerwania 11h. Konfiguracją systemu może być liczba twardych dysków podłączonych do systemu, pojemność RAM-u płyty głównej, tryb video, liczba podłączonych kart RS-232 i liczba podłączonych drukarek.

Określenie ilości dostępnej pamięci RAM

Podczas gdy przerwanie 11h tylko zwraca sumę pamięci RAM na płycie głównej, przerwanie 12h pozyskuje wielkość RAM-u osiągalnego w całym systemie. To jest całkowita suma RAM-u na płycie głównej i rozszerzonej pamięci kart. Ta metoda określa RAM tylko poniżej limitu 1MB. Procesor 80286 i wyższe jest w stanie podnieść pojemność pamięci do 16MB. Jednakże przerwanie 12h nie może odnosić się do pamięci poza 1MB.

Dostęp do dysku z BIOS-u

Każda strona dyskietki 3,5 cala składa się z 80 ścieżek na każdym z 18 sektorów. Każdy sektor ma pojemność 512 bajtów. ścieżka jest ponumerowana od 0 do 79. ścieżka 0 jest zlokalizowana na zewnętrznej krawędzi, a 79 na wewnętrznej krawędzi dysku. Dysk ma 2 strony numerowane od 0 do 1. Ten dysk ma całkowitą pojemność magazynowania 1.44 MB. Metody przesyłu danych do lub z dysku są identyczne. Najpierw ustawiana jest głowica odczytu/zapisu na odpowiedniej ścieżce. Odtąd dysk rusza się stale, sektor , który jest używany ewentualnie przechodzi obok głowicy, pozwalając przesyłać dane. BIOS udostępnia funkcje dla dysku niskiego poziomu. Wszystkie 6 funkcji dyskowych BIOS-u mogą być dostępne przez przerwanie 13h. Lista przerwań jest następująca:

Numer funkcji Działanie
00h Resetuje dysk
01h Odczytuje status dysku
02h Oczytuje dane z dysku
03h Zapisuje dane na dysku
04h Weryfikuje dysk
05h Formatuje część dysku

Nowsze BIOS-y zawierają nowe funkcje dyskowe, które są także wywoływane przez przerwanie 13h. Pierwsza z tych nowych funkcji ma nr 15h. Określa typ dysku w użyciu. Następna funkcja - 16h wykrywa zmiany dysku, a 17h pomaga formatować dysk.

Dostęp do twardego dysku z BIOS-u

Podobnie jak dyskietka, twardy dysk składa się z magnetycznych talerzy, które mogą magazynować dane w formie impulsów magnetycznych. Dysk twardy składa się jednak z kilku takich talerzy.

Każdy dysk składa się z talerzy, pierścieni na każdej stronie każdego talerza nazywanych ścieżkami i sekcji na każdej ścieżce zwanych sektorami. Sektor jest najmniejszą fizyczną jednostka magazynowania, prawie zawsze rozmiaru 512 bajtów.

BIOS udostępnia dostęp do twardego dysku przez przerwanie 13h - to samo przerwanie jest używane dla dostępu do dyskietki. Pojedyncze funkcje są identyczne dla twardego dysku i dyskietki, lecz BIOS używa różnych modułów dla ich kontroli. Kiedy wywołujemy przerwanie 13h, wywoływana jest najpierw funkcja obsługi twardego dysku. Ta funkcja testuje, co ma być adresowane: dysk twardy czy dyskietka. Jeśli wymagana jest dyskietka, wywołany musi być inny moduł (przez przerwanie 40h).

Pamięć CMOS

CMOS w komputerze przechowuje informacje o podłączeniu dysków do komputera. Kiedy instaluje się lub zmienia dyski nie-SCSI, należy użyć programu BIOS-Setup dostarczonemu do komputera, w celu zaktualizowania informacji w CMOS-ie. (dyski SCSI mają własne programy konfiguracyjne, z reguły dostarczane przez producenta).

Możliwa jest sytuacja, że baterie CMOS-u się wyczerpią, jeśli przez dłuższy czas nie wyłącza się komputera. Poza tym CMOS czasami zawodzi.

Dostęp do szeregowych portów z BIOS-u

Komputery mogą komunikować się między sobą i wymieniać dane. Dane są przesyłane jedne po drugich. Przesył danych jest możliwy wtedy, kiedy jest asynchroniczny port komunikacyjny RS-232. Ta karta pozwala na przesył danych między dwoma komputerami bezpośrednio przez kabel albo za pośrednictwem linii telefonicznej. Nowsza metoda wymaga modemu dla nadawcy i odbiorcy.

BIOS oferuje oprogramowanie kontrolujące port RS-232. Są 4 funkcje wywoływane przerwaniem 14h.

Numer funkcji Działanie
00h Ustawienie protokołu
01h Przesłanie znaku
02h Odebranie znaku
03h Odczytanie statusu linni/modemu

Dostęp do klawiatury z BIOS-u

Przerwanie 16h dostarcza 3 funkcje do czytania klawiatury i jej status. Nie istnieje żadna funkcja klawiatury BIOS-u, która usuwałaby znaki z bufora klawiatury lub zmieniałaby nazwy klawiszy. Niektóre kombinacje klawiszy nie mogą być czytane przez BIOS jako kody klawiszy, ponieważ wymagają specjalnych komend. Przyciski <PTRSC> lub <PRINT> wywołują przerwanie 05h, żeby przesłać obecnie wyświetlany obraz do drukarki. Klawisze <CTRL><NUM Lock> zatrzymują system, dopóki użytkownik nie naciśnie innego klawisza. Klawisze <CTRL><BREAK> wywołują przerwanie 1Bh w celu zatrzymania obecnego programu.

Funkcja 00h z przerwania 16h czyta znaki z bufora klawiatury i przekazuje je do wywołującego programu. Jeśli nie ma żadnego znaku w buforze, czeka aż znak zostanie wprowadzony i wtedy powraca do wywołującego programu.

Funkcja 01h z przerwania 16h również czyta klawiaturę. W przeciwieństwie do funkcji 00h, pozostawia poprzedzający znak w buforze klawiatury. Inaczej niż funkcja 00h, funkcja 01h natychmiast informuje wywołujący program, czy znak jest osiągalny, czy nie. Funkcja 02h czyta status pewnych klawiszy kontrolnych.

Funkcją ROM-BIOS-u, która przechwytuje wciśnięcie klawisza, jest przerwanie 09h. Przewania 09h i 16h pracują jednocześnie. Przerwanie 09h przechowuje uderzenia klawiszy w buforze, wtedy 16h pobiera uderzenie z bufora.

Dostęp do drukarki z BIOS-u

BIOS oferuje 3 funkcje do komunikacji z jedna lub większą ilością interfejsów drukarek w PC, wywoływane przez przerwanie 17h. Funkcje te mogą określać do którego wyjścia powinien iść obraz.

Numer funkcji Działanie
00h Wysłanie znaku do drukarki
01h Inicjalizacja portu drukarki
02h Odczytanie statusu drukarki

Dostęp do danych i czasu z BIOS-u

Przerwanie 1Ch jest używane do obsługi urządzenia zegarowego i służy do wyświetlania czasu na ekranie. Przerwanie 08h uaktualnia czas licznika dni a przerwanie 1Ah może być użyte przez program, żeby odczytać lub ustawić czas zegara systemowego.

Magazynowanie danych

Ponieważ BIOS znajduje się w pamięci płyty głównej, przechowywanie przez niego informacji nie powinno dziwić. Lecz obszar przechowywanej pamięci ROM-BIOS-u zawiera tylko trywialną część danych systemu potrzebnych do działania BIOS-u - kilka bajtów do identyfikacji producenta BIOS-u, jego wersję i datę. Poza przechowywaniem danych "o sobie", BIOS posiada także niewielki obszar danych, gdzie trzymne są informacje o konfiguracji komputera, takich jak np. typ zainstalowanego twardego dysku. Dzięki temu obszarowi przechowywania ustawień można używać funkcji BIOS-Setup.

W normalnych operacjach na komputerze, najbardziej znaczącą funkcją BIOS-u związana z przechowywaniem danych, jest rezerwacja obszaru magazynowania, który BIOS tworzy w PC-cie. Kiedy BIOS inicjalizuje komputer, gromadzi informacje o jego wyposażeniu i właściwościach i chowa wyniki w oznaczonym miejscu w systemie pamięci. On sprawdza numery i typy zainstalowanych portów, typy urządzeń wyświetlających (kolorowe czy monochromatyczne) i inne opcje. Zawiera wśród danych flagi, bazę adresów wejścia/wyjścia, rodzaj klawiatury i tryb operacyjny. BIOS magazynuje te informacje w specjalnym miejscu w pamięci tak, że programy mogą sprawdzić, które własności są dostępne lub które są używane. Np. BIOS szuka serii portów pod określonym adresem. Wszystkie opisane przez siebie informacje o systemie przechowuje w specjalnej części RAM-u (wcześśniej wspominanej przestrzeni danych BIOS-u).

Wektor przerwań jest położony zaraz powyżej. Przestrzeń danych BIOS-u stanowi 256 bajtów pamięci, zaczynając od absolutnej lokacji pamięci 000400h i biegnie do 0004FF. Ponadto, Rozszerzony Obszar Danych BIOS-u uzupełnia magazyn danych dostępny w podstawowym obszarze danych BIOS-u. Ten dodatkowy magazyn stanowi górne kilobajty pamięci RAM. Program umiejscawia swój adres wywołując podstawową funkcję BIOS-u, używając przerwania 15h. Windows, w zasadzie, utrzymuje swoją własną tablice z danymi i generalnie nie polega na normalnym czy przedłużonym obszarze pamięci BIOS-u.

BIOS kontroluje inny rodzaj pamięci, system CMOS (Complimentary Metal Oxide Semiconductor), gdzie są przechowywane informacje opcji. W zasadzie celem zwykłych ustawień BIOS-u jest zmienianie pamięci CMOS w komputerze PC. Technologia CMOS jest używana, żeby zrobić wewnętrzny obwód pamięci chips. Najważniejszą cechą CMOS-u jest to, że wymaga malutkiej ilości mocy do zachowania informacji. Ponieważ wymaga małej mocy, mała bateria może utrzymać CMOS nienaruszonym przez lata. Co więcej, CMOS działa jak normalna pamięć komputera i jest łatwa do zmieniania. Twórcy PC używają CMOS-u do przechowywania ustawień konfiguracji systemu, ponieważ jest względnie łatwa do zmiany. Pamięć ta przechowuje dane opisujące sprzęt w komputerze, żeby go zbootować.

Trochę więcej ostrożności jest wymagane przy pamięci Flash. Pamięć do zapisu Flash jest bardziej skomplikowana niż zwykła pamięć do zapisu - wymaga ona specjalnego napięcia i operacji przeniesienia bloków. Co więcej, wczesna pamięć Flash chips mogła okazywać się bezużyteczna, jeśli operacja zapisu była bez uprzedzenia przerywana. Dlatego właśnie instrukcje upgrade kładą nacisk na nieprzerywanie procesu. Choć nowoczesna Flash BIOS-u z blokiem ochrony boot minimalizuje niebezpieczeństwo, większość produktów wciąż zaleca, aby najważniejsze było bezpieczeństwo. Błędy upgradeowania BIOS-u czynią system niezdolnym do działania i wymagają udania się do punktu napraw.

Godnym uwagi jest to, że niektóre płyty główne obecnej generacji chronią pamięć Flash także przed przypadkowym nadpisaniem lub złośliwym uszkodzeniom, które mogą powstać pod wpływem działania wirusów.

System zabezpieczeń w BIOS-ie

System zabezpieczeń w BIOS-ie jest dwupoziomowy. Składa się z hasła użytkownika (User Password) oraz hasła administratora (Supervisor Password). Pierwsze z nich broni ogólnego dostępu do komputera (w tym samo uruchamianie). Hasło administratora rozszerza ochronę na program konfiguracyjny CMOS-Setup. Przyjęta dwupoziomowość zapewnia umożliwia ochronę komputera przed próbami manipulacji w programie konfiguracyjnym, a jednocześnie implementuje prosty mechanizm ochrony ogólnego dostępu. Użytkownik dysponujący hasłem do przydzielonego mu komputera ma mieć możliwość uruchomienia go i pracy zgodnie z profilem ustalonym przed administratora. Użytkownik taki koniecznie musi mieć dostęp do opcji, która na przykład blokuje możliwość kopiowania na dyskietki. Hasło administratora otwiera wejście zarówno do CMOS-Setup, jak i do samego komputera. Hasło użytkownika wprowadza go wprawdzie również do programu konfiguracyjnego , ale tylko pozornie. Jedyne aktywne opcje to w tym przypadku USER SETUP (w celu zmiany własnego hasła) i powrót do systemu (z zapamiętaniem zmian lub bez).

Jednak system zabezpieczeń w BIOS-ie jest na bardzo podstawowym poziomie. Opiera się na hasłach, a implementacja mechanizmu ochrony ma więcej luk niż elementów zabezpieczających. Przykładowo algorytmy szyfrowania opierają się na kodowaniu typu XOR lub CRC, a czasami nawet na wyliczeniu 16-bitowej sumy kontrolnej.

Ciekawostki dotyczące haseł: jakie są hasła generalne i jak poradzić sobie bez hasła: http://republika.pl/videovision/bios1.shtml

BIOS dzisiaj

BIOS się rozwija

Obecność procedur BIOS-u jako tradycyjnej platformy pośredniczącej między sprzętem i systemami operacyjnymi oraz aplikacjami jest tolerowana w dzisiejszych czasach jedynie ze względu na wymóg kompatybilności. Współczesne systemy operacyjne bazują na całej armii sterowników programowych, zwracających się bezpośrednio do określonych urządzeń. Skoro więc w tym zakresie nie trzeba już nic w BIOS-ach poprawiać, zaczęto wymyślać różne dodatki i udogodnienia.

Są to na przykład obrazki w BIOS-ie (zmiana symbolu graficznego, który pojawia się obok komunikatów), funkcja diagnostyki głosowej (kilka prostych komunikatów wypowiadanych po angielsku) itp. Ciekawe jest, że BIOS posiada również swoją kopię zapasową. Pomysł pojawił się z powodu wirusów i fatalnych skutków błędów przy aktualizacji pamięci EEPROM. W przypadku uszkodzenia podstawowego bloku roboczego istnieje możliwość przełączenia się na blok pomocniczy, którego główne zadanie polega na odtworzeniu bloku roboczego. Komputer sprawdza na wstępie, czy aktualnie uruchamiany BIOS jest "sterowny" i w razie czego przełącza się na kopię rezerwową. Choć mimo istnienia tego koła ratunkowego nie da się uniknąć wszystkich niebezpieczeństw (aktualizacji Flash podlegają oba bloki, pamięć CMOS-RAM jest wspólna), idea ta jest słuszna.

Czy BIOS to przeszłość?

Mimo, iż niektórzy programiści są zdania, że nie warto używać BIOS-u do komunikowania się ze sprzętem, każdy komputer PC potrzebuje BIOS-u. Te podstawowe funkcje są wymagane, ponieważ wymagana jest kontrola nad komputerem przed załadowaniem systemu operacyjnego. Klawiatura musi działać, aby można było wybierać różne opcje, monitor musi pokazywać co i w jaki sposób dzieje się z systemem. Mimo, że Windowsy potrafią poradzić sobie z wieloma funkcjami, które wykonuje BIOS, nie każdy chce uruchamiać właśnie ten system operacyjny. Widzimy więc, iż pomimo niewielkiego użycia przez większość ludzi, funkcje interfejsu BIOS-u przetrwają teraz i zapewne również w przyszłości.

Jeśli nie BIOS, to co?

W poprzednich częściach prezentacji pokazaliśmy czym jest BIOS, jak działa, co potrafi, w czym jest podobny do systemów operacyjnych a czym się od nich różni. W tej części postaramy się pokazać ograniczenia BIOSu, które znacząco wpływają na jego używalność. Pokażemy też, na przykładzie projektu LinuxBIOS, jak ludzie postanowili sobie poradzić z tym problemem.

Ograniczenia BIOSu

O ile dla zwykłego użytkownika komputera BIOS jest praktycznie niezauważalny, pewne cechy BIOSów dostępnych na rynku komputerów potrafią być prawdziwą zmorą inżynierów, konstruktorów sprzętu oraz administratorów dużych systemów komputerowych. Okazuje się również, że pomimo tego iż zadaniem BIOSu jest wykonanie kilku bardzo prostych czynności, nie wszystkie jego odmiany potrafią zrobić to dobrze:

To właśnie olbrzymia niewygoda w zarządzaniu większą ilością komputerów sprawiła, że ludzie zaczęli poszukiwać innych rozwiązań. Naturalnym przecież rozwiązaniem dla klastrów złożonych z dziesiątek, setek lub nawet tysięcy komputerów jest aktualizacja przez sieć, której nie wymyślono przecież wczoraj. Mimo upływu czasu wszystkie procesory rodziny x86 startują w trybie 8086, z 16 bitową przestrzenią adresowania, emulując 6 megahercowy procesor sprzed ćwierćwiecza.

LinuxBIOS - system ładuje system

LinuxBIOS może zastąpić standardowy BIOS komputerów różnych architektur. Proces uruchamiania i konfiguracji BIOSu został zastąpiony przez prostą część inicjalizacyjną, po której następuje rozpakowanie i uruchomienie jądra systemu Linux. Jakkolwiek nazwa sugeruje (skądinąd słusznie) nierozerwalny związek LinuxBIOSu z systemem operacyjnym Linux, LinuxBIOS potrafi też uruchamiać inne systemy. Oprócz standardowych metod (wczytanie jądra z urządzenia pamięci masowej, jak dyskietka czy dysk twardy), LinuxBIOS oferuje również możliwość ładowania systemu przez sieć czy przez NFS. Co więcej, wykorzystanie sieci nie ogranicza się tylko do najpopularniejszego Ethernetu. Proszę teraz pomyśleć o tworzeniu ze standardowym BIOSem maszyn, w których nie chcemy lub nie możemy mieć urządzeń pamięci masowej, a które podążając za modą możemy i chcemy spiąć w sieć. Do zarządzania LinuxBIOSem można używać np. połączeń SSH.

Cały projekt LinuxBIOS to 500 linii kodu asemblera i 1500 linii kodu C. Łata na jądro Linuxa, potrzebna do obsługi nie zainicjalizowanego sprzętu, to około 10 linii.

Struktura LinuxBIOSu

Podstawowym założeniem twórców LinuxBIOSu było nie wymyślanie koła od początku. Całą ciężką pracę postanowili przerzucić na gotowy, dobry i sprawdzony system jakim w ich mniemaniu jest Linux.

Pewne nowe BIOSy (typu open source) pozostają przy starej metodzie wykonywania prawie całej pracy w trybie 16 bitowym aby do 32 bitowego trybu chronionego przejść tuż przed rozpoczęciem ładowania systemu operacyjnego. Podejście takie pociąga za sobą trzy poważne problemy:

Twórcy Linux BIOSu postanowili przechodzić do trybu 32 bitowego natychmiast po starcie (dzieje się to już w 17 instrukcji). Po przejściu do trybu chronionego wykonywana jest inicjalizacja chipsetu. I o ile wydawać by się mogło, że czynność ta wymaga olbrzymiej ilości kodu asemblera, w rzeczywistości asembler jest potrzebny tylko do uruchomienia DRAMu. Po tym zabiegu można już użyć C. Taka możliwość nie tylko w sposób oczywisty podnosi czytelność kodu i skraca czas potrzebny na zmiany w nim. Powoduje też, że tak napisany BIOS staje się dużo łatwiej przenaszalny, nawet między różnymi architekturami.

Problem pojawia się na styku z Linuxem. LinuxBIOS startuje i działa na zupełnie nie zainicjalizowanym sprzęcie. I nie może o stanie zainstalowanego sprzętu niczego zakładać. Z drugiej strony Linux zakłada, że cały sprzęt został zainicjalizowany przez BIOS. Stąd pojawiła się konieczność dokonania zmian w kodzie jądra.

Przejście do trybu chronionego

Pierwszą instrukcją, zgodnie ze standardem wykonaną w trybie 16 bitowym pod adresem 0xffff0 jest skok do kodu BIOSu. Ta instrukcja jest standardową częścią "procedury reset" procesorów rodziny x86:

_start: jmp _realstart

Kolejne pięć instrukcji to zablokowanie przerwań, wyczyszczenie TLB i ustawienie segmentu danych i kodu:

_realstart:
	cli
	movw %cs, %ax
	movw %ax, %es
	xor %eax, %eax
	mov %eax, %cr3

Następnie ładowany jest wskaźnik do globalnej tablicy deskryptorów (GDT):

	lgdt EXT(gdtptr)

Włączenie ochrony pamięci, 4 instrukcje:

	movl %cr0, %eax
	and $0x7FFAFFD1, %eax
	orl $1, %eax
	movl %eax, %cr0

Dalsza część to konfiguracja rejestru segmentu dla trybu chronionego:

	movw $0x18, %ax
	movw %ax, %ds
	movw %ax, %es
	movw %ax, %ss
#ifdef i586
	movw %ax, %fs
	movw %ax, %gs
#endif
	movl $_PDATABASE, %esp

Gotowe. Po 17 instrukcjach asemblera znajdujemy się już w trybie chronionym procesora, możemy zaadresować 4 GB pamięci i działać jako Pentium a nie tylko jako 8086.

Konfiguracja DRAMu

We współczesnych płytach głównych DRAM zazwyczaj wymaga pewnej konfiguracji. Kłopoty sprawiać może zwłaszcza SDRAM. Mimo iż np. obsługa płyt Intela L440GX+ to 79 linii kodu asemblera, ta część LinuxBIOSu okazała się najtrudniejszą częścią projektu - oprogramowanie obsługi każdej nowej płyty głównej trwało tygodniami.

Reszta LinuxBIOSu jest napisana już w C. Ostatnie instrukcje tej części LinuxBIOSu ustawiają stos i uruchamiają procedurę inicjalizacyjną płyty głównej.

Inicjalizacja płyty głównej

Inicjalizacja płyty głównej wymaga konfiguracji pewnej części sprzętu, który będzie potrzebny do załadowania jądra:

Oprócz tego trzeba zrobić to, czego Linux nie potrafi i to, czego Linux nie robi:

Ta część kodu LinuxBIOSu to aktualnie 330 linii

Dekompresja i uruchomienie jądra

Ta część to w większości kod przepisany z jądra Linuxa. Drobne zmiany zostały wprowadzone tylko tam, gdzie były niezbędne do poprawnego działania:

Po skopiowaniu parametrów uruchamiany jest standardowy gunzip jądra Linuxa i jądro jest dekompresowane do miejsca standardowego dla konkretnej architektury (dla PC jest to adres 0x100000).

Uruchomienie jądra to prosta instrukcja skoku. Od uruchomienia systemu operacyjnego różni się tym, że skok wykonywany jest bezpośrednio do początku kodu jądra, a nie do procedury konfiguracyjnej. Większa część standardowej konfiguracji jądra Linuxa (np. dekompresja reszty jądra) nie jest potrzebna - zostało to już zrobione podczas uruchamiania LinuxBIOSu.

Po starcie LinuxBIOSu

Teraz pokażemy kilka przykładów zastosowania LinuxBIOSu, już po jego uruchomieniu. Są to różne sposoby ładowania systemu operacyjnego oraz zdalnego zarządzania LinuxBIOSem.

Po bożemu, czyli standardowo

LinuxBIOS nie byłby BIOSem, gdyby nie potrafił załadować systemu operacyjnego znajdującego się na jakimś nośniku dostępnym w uruchamianym systemie. Może to być CD-ROM, dyskietka czy wreszcie dysk twardy. Ta procedura różni się od tej udostępnianej przez "zwykłe" BIOSy dwoma istotnymi szczegółami:

Odrobina perwersji, czyli po kablu

W momencie uruchomienia przez LinuxBIOS jądra Linuxa, dysponujemy działającym, prawie pełnowartościowym jądrem systemu operacyjnego. Nie ma więc żadnych przeszkód, aby np. ustanowić połączenie SSH ze zdalnym serwerem konfiguracyjnym, ktory po oszacowaniu aktualnego obciążenia łącz wskaże serwer, z którego należy pobrać dalsze dane. Warto tu zwrócić uwagę, że twórcy LinuxBIOSu wskazują iż ich doświadczenia pokazały znaczącą przewagę połączeń SSH (używających przecież protokołu TCP) nad połączeniami przy użyciu protokołu, który naturalnie wydaje się lepszy do takich celów - UDP (jest oszczędniejszy i prostszy od TCP). Poza oczywistą różnicą wynikającą z możliwości szyfrowania i uwierzytelniania połączenia (są to cechy protokołu SSH) autorzy wskazują przede wszystkim na stabilność protokołu TCP przy dużym obciążeniu sieci.

Bizarre, czyli bez dysku

Zdalny serwer może nakazać mountowanie systemu plików przez NFS (lub dowolny inny sieciowy system plików, jak CODA lub AFS). Uruchomione jądro może wtedy załadować system z tak przyłączonego udziału.

Zdalne zarządzanie LinuxBIOSem

Zdalny serwer może też zlecić uruchomionemu jądru np. otwarcie portu i nasłuchiwanie w celu przeprowadzenia zdalnej konfiguracji. Taki komputer nie uruchomi nawet /sbin/init, tylko będzie czekał na instrukcje od programu zarządzającego. Można w ten sposób nie tylko zmienić parametry LinuxBIOSu, ale też np. wgrać do NVRAMu nowy kod jądra czy też zlecić partycjonowanie dysku twardego.

Warto zaznaczyć, że otwierany port oraz zarówno program zarządzający jak i nasłuchujący na komputerze-węźle serwer mogą być dowolne. W szczególności nie musi to być port 22 i nie musi to być ssh/sshd. Nic nie stoi więc na przeszkodzie, aby nasz komputer mógł być zarządzany choćby przez przeglądarkę WWW.

LinuxBIOS: Podsumowanie

LinuxBIOS to mały i zgrabny BIOS który całkowicie zastępuje standardowego BIOSa. Prosta procedura startowa ładuje Linuxa z NVRAMu i uruchamia go. Struktura LinuxBIOSu jest prosta: użytego asemblera wystarczy, aby uruchomić niezbędne części systemu; kodu C wystarcza na inicjalizację sprzętu i załadowanie Linuxa; a resztą LinuxBIOSu jest sam Linux. Praca LinuxBIOSu ogranicza się do minimum, resztą może zając się system operacyjny. LinuxBIOS umożliwia zarządzanie komputerem na którym się znajduje w sposób nieznany i niedostępny dla użytkowników standardowych BIOSów.

Czy BIOS to OS?

Porównując BIOS z definicją systemu operacyjnego z wykładu łatwo dojść do wniosku że istotnie, można zaryzykować nazwanie BIOSu systemem operacynym:

Dlatego BIOS można traktować jako bardzo prosty system operacyjny. Chociaż, jak pokazuje przykład LinuxBIOSu, potencjalne możliwości BIOSu nie muszą się niczym różnić od możliwości poważnych systemów operacyjnych.

Słownik użytych pojęć

Bootstapping Chipset DRAM GDT MTRR NVRAM TLB SDRAM

Bibliografia

Slajdy prezentacji: show.tar.gz