Bootowanie
Bootowanie systemu polega na przeniesieniu części systemu operacyjnego do pamięci i polecenie
procesorowi wykonania jej.
Bootowanie systemu musi być napisane w języku asemblera, gdyż sam proces ładowania jądra systemu
jest związany z architekturą.
Ładowanie się systemu jest podzielone na kilka faz.
BIOS
BIOS przeprowadza testy na obecność i poprawność działania sprzętu.
Następnie inicjuje urządzenia sprzętowe. Ta faza ma zagwarantować, że nie będzie kofliktów
na liniach IRQ i adresach portów I/O.
W zależności od ustawieć poszukuje systemu operacyjnego do załadowania.
Jeżeli znajdzie urządzenie z systemem, kopiuje zawartość jego pierwszego sektora począwszy
od adresu 0x00007c00 i uruchamia ten kod.
Boot Loader
Programem, który powinien zostać uruchomiony jest Boot Loader. W zależności od tego,
czy system ładowany jest z dyskietki, czy też z dysku twardego, proces ten przebiega trochę odmiennie.
Ładowanie z dysku twardego
Master Boot Record, czyli pierwszy sektor dysku twardego zawiera tabicę partycji oraz
program ładujący pierwszy sektor partycji zawierającej system operacyjny.
W Linuxie w MBR może znajdować się część programu LILO.
Program ten przenosi się pod inny adres (0x0009a000), ustawia stos trybu rzeczywistego, i ładuje swoją drugą część.
Następnie czyta listę dostępnych systemów operacyjnych i dla wybranego systemu kopiuje program ładujący obraz jądra (0x00090000),
kod setup (0x00090200), i resztę obrazu jądra (0x00010000) lub (0x00100000).
Ładowanie z dyskietki
Podczas ładowania systemu z dyskietki wykonywany jest program zakodowany w pliku: arch/i386/boot/bootsect.S
Program ten podobnie do LILO przenosi się pod adres (0x00090000), ustawia stos trybu rzeczywistego (ale też na inny adres).
Następnie kopiuje funkcje setup i resztę obrazu jądra tak samo jak LILO.
Funkcja setup
Funkcja setup (0x00090200) inicjuje urządzenia, odwzorowywuje przerwania IRQ na przedział od 32 do 47.
Włącza tryb chroniony procesora i wykonuje skok do funkcji startup_32 .
Funkcja startup_32
Funkcja ta znajduje się w pliku arch/i386/boot/compressed/head.S
Funkcja ta inicjuje rejestry segmentacji i tymczasowy stos, wypelnia zerami niezainicjowany obszar jądra i wywołuje funkcje
decompress_kernel, w celu zdekompresowania jądra.
Zdekompresowane jądro zaczyna się od innej funkcji startup_32. Ta funkcja znajduje się w pliku
arch/i386/kernel/head.S. Kończy ona inicjację rejestrów, ustawia stos trybu jądra dla procesu 0,
identyfikuje parametry systemu i wykonuje skok do funkcji start_kernel.
Funkcja start_kernel
Jest to pierwsza funkcja wywoływana podczas bootowania systemu napisana w C. Inicjuje ona złożone struktury danych,
takie jak tablicę stron czy czas systemowy.
Powrót