Czy BIOS jest małym systemem operacyjnym?
18.12.2003
Elżbieta Iwaszkiewicz
Małgorzata Zalewska
Piotr Korba Tomczyk
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.
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
.
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.
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).
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.
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".
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.
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
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ę:
F000h:FFF0h
. To jest część ROM-BIOS-u i polega na komendzie
skoku do funkcji BIOS-u, która przejmuje inicjalizację systemu. Miejsce tych
funkcji może być różne w różnych komputerach, ale funkcje są wykonywane
niemalże identycznie dla prawie każdego PC.
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...
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
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 |
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.
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.
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.
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
).
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.
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 |
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.
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 |
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.
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 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
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.
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.
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.
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 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.
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.
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.
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 wymaga konfiguracji pewnej części sprzętu, który będzie potrzebny do załadowania jądra:
gunzip
zadziałał w rozsądnym
czasie: bez MTRR dekompresja jądra zajmuje około minuty, z cache'owaniem
czas ten jest tak krótki, że trudno go zmierzyć.Oprócz tego trzeba zrobić to, czego Linux nie potrafi i to, czego Linux nie robi:
Ta część kodu LinuxBIOSu to aktualnie 330 linii
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:
gunzip
bez pewnych zmian nie będzie działał
w środowisku z pamięcią tylko do odczytu. Wymaga to np. deklarowania tablic
jako stałych.
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.
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.
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:
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.
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.
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 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.
Porównując BIOS z definicją systemu operacyjnego z wykładu łatwo dojść do wniosku że istotnie, można zaryzykować nazwanie BIOSu systemem operacynym:
Slajdy prezentacji: show.tar.gz