W jaki sposób ładowane jest jądro systemu operacyjnego do pamięci komputera? W jaki sposób przebiega proces bootowania? Co oznaczają terminy boot, bootstrap, bootstrap load?
Fazy uruchamiania systemu komputerowego:
włączenie komputera (autotest zasilacza: power good
procesor pobiera zawartość komórki pamięci FFF:0000h i wykonuje skok do wskazanego adresu, gdzie jest BIOS; rozpoczyna się POST (Power-On Self Test)
POST - sprawdza, czy uruchomienie miało charakter twardy (wykonywany jest pełen test sprzętu), czy miękki (pomijany jest test pamięci) - sprawdza BIOS, pamięć CMOS i jej baterię - inicjuje kartę grafiki i ją sprawdza - identyfikuje BIOS (wyświetlana jest wersja, producent, data) - testuje pamięć operacyjną (wyświetlana jest jej wielkość) - sprawdza i inicjuje urządzenia sprzętowe (przydział IRQ, adresów I/O, lista zainstalownych urządzeń PCI)
pobranie ustawień z CMOS
poszukiwanie systemu do uruchomienia (kolejność bootowania); poszukiwany jest sektor, który zawiera program ładujący fazy pierwszej (dwa ostatnie bajty to 0x55 oraz 0xAA, czyli 0xAA55)
ładowanie programu ładującego do pamięci głównej i jego uruchomienie
ładowanie do pamięci programu ładującego fazy drugiej, który odpowiedzialny jest za załadowanie i uruchomienie systemu operacyjnego
inicjacja pracy systemu: /etc/rc.d/rc.S
(BSD), poziomy pracy systemu
(sysVinit), Upstart (Ubuntu 6.10, CentOS 6.x), systemd (Debian/Fedora/CentOS 7)
Zob.
http://www.ibm.com/developerworks/linux/library/l-linuxboot/
https://www.happyassassin.net/2014/01/25/uefi-boot-how-does-that-actually-work-then/
https://www.ibm.com/support/knowledgecenter/linuxonibm/liaav/Demystifying-the-Kernel-Bootstrap-Process.pdf
Demystifying-the-Kernel-Bootstrap-Process
,
http://www.almesberger.net/cv/papers/ols2k-9.ps.gz, Booting Linux
Wybór systemu operacyjnego:
specjalizowany MBR, specjalizowany sektor rozruchowy (VBS)
BIOS poszukuje urządzenia z poprawnym sektorem rozruchowym, tzw. MBR (Master Boot Record), czyli pierwszym blokiem dysku (C=0, H=0, S=1), z którego pobierany jest program ładujący.
Struktura MBR-u:
446 B (lub 440 dla Windows NT) dla programu rozruchowego (główny kod startowy)
64 B tabela partycji (aktywna partycja)
2 B AA55h (magic number)
Kod startowy czyta tablicę partycji, odszukuje pierwszy sektor aktywnej partycji i ładuje kopię tego sektora do pamięci (tzw. volume boot sector).
Kiedyś z uruchamianiem systemu związane były dwa problemy:
1024 limit (504 MiB) – rozwiązanie: enhanced BIOS wspierający translację
8 GB limit – rozwiązanie: funkcja przerwania INT 13h zastąpiona przez funkcję extended INT 13h,
Zob. http://www.pcguide.com/ref/hdd/bios/sizeMB504-c.html, http://www.pcguide.com/ref/hdd/bios/sizeGB394-c.html.
rozruch łańcuchowy
Każdy sektor rozruchowy jest odpowiedzialny za ładowanie właściwego systemu operacyjnego, który po uruchomieniu pozwala na kontynuację bootowania z przekazaniem sterowania do sektora rozruchowego innej partycji.
Programy ładujące fazy pierwszej:
BIOS (Basic Input/Output System) – dla urządzeń x86, x86_64
BIOS to zbiór funkcji tworzących interfejs pomiędzy systemem operacyjnym (SO) i sprzętem; BIOS był pierwotnie wykorzystywany do uruchamiania komputerów klasy PC i zapewnienia komunikacji między SO i urządzeniami wejścia/wyjścia (I/O).
Wcześniej BIOS był używany przez system operacyjny CP/M dla mikrokomputerów 8-bitowych.
BIOS był modernizowany wraz z rozwojem rynku komputerów zgodnych z PC.
BIOS jest specyficzny dla architektury procesorów x86, gdyż bazuje na 16-bitowym rzeczywistym (real mode) trybie dostępu do pamięci (adresowanie ograniczone do 1 MB).
Coreboot
Projekt FSF; zastąpienie BIOS-u przez otwarte oprogramowanie firmowe pozwalające na ładowanie systemów 32- i 64-bitowych. Brak wsparcia dla wywołań BIOS; SeaBIOS dostarcza tych wywołań (nowoczesne systemy operacyjne z nich nie korzystają).
Wersja x86 wykonuje się w trybie 32-bitowym po wykonaniu 10 instrukcji.
Das U-Boot (Universal Bootloader) – dla urządzeń z osadzonym systemem operacyjnym
EFI/UEFI (Extensible Firmware Interface/Unified EFI) – specyfikacja opracowana przez firmę Intel
Etherboot —> gPXE —> iPXE – sieciowe programy ładujące (Preboot Execution Environment)
OpenBIOS, OpenBoot – implementacje standardu Open Firmware (IEEE 1275-1994)
SLOF (Slimline Open Firmware) – oprogramowanie wytwarzane przez IBM, wspiera architekturę PowerPC
Programy ładujące fazy drugiej:
loadlin – program ładujący system Linux działający w systemie DOS/Windows
LILO (LInux LOder) – (były) domyślny program ładujący dla większości dystrybucji (następca programu loadlin)
SILO (SPARC Improved bootLOader) – program ładujący system Linux (także Solaris) dla architektury SPARC
GNU GRUB (GRUB Legacy), GRUB/GRUB2 – domyślny program ładujący system Linux
NTLDR – program ładujący dla systemów Windows NT (do Windows Server 2003)
BOOTMGR – program ładujący dla systemów: Windows Vista, Windows Server 2008, Windows 7/8/10
Programy ładujące *LINUX fazy drugiej (zob. http://www.syslinux.org/wiki/index.php/SYSLINUX):
SYSLINUX – program ładujący SO Linux z partycji FAT systemów MS-DOS/Windows
ISOLINUX – program ładujący SO Linux z partycji ISO 9660/El Torito (z CD-ROM-u)
Standard El Torito pozwala na bootowanie w dwóch trybach: z i bez emulacji dyskietki. W trybie z emulacją dyskietki jej obraz jest pobierany z CD-ROM-u, a następnie udostępniany systemowi jako wirtualna stacja dyskietek (obraz jest faktycznie systemem plików FAT, więc do ładowania SO jest używany SYSLINUX). W trybie bez emulacji informacja potrzebna do bootowania jest zgromadzona bezpośrednio na CD, a do jej wykorzystania potrzebny jest program ISOLINUX.
EXTLINUX – program ładujący SO Linux z partycji ext2/3/4
PXELINUX – program ładujący SO Linux z serwera w sieci
Do załadowania programu niezbędna jest karta sieciowa wspierającą PXE lub odpowiedni program czytany z nośnika (dyskietka/klucz USB), zob. ROM-o-matic.net.
MEMDISK – program ładujący system operacyjny (legacy) via PXE; także kiedy BIOS systemu komputerowego nie wspiera obrazów ISOLINUX-a.
MEMDISK emuluje dysk używając wysokiej pamięci, umieszczając sterownik dysku w niskiej pamięci i zmieniając obsługę przerwań: INT 13h (sterownik dysku) i INT 15h (sprawdzanie pamięci); zob. Etherboot.org.
UEFI (wersja 2.6, 01/2016)
specyfikacja definiująca niezależny od architektury procesora interfejs pomiędzy systemem operacyjnym i sprzętem
stanowi (od około 2005) rozszerzenie specyfikacji EFI wprowadzonej przez firmę Intel (połowa lat 1990) i rozwijanej przez Unified EFI Forum. UEFI wspiera szyfrowanie, uwierzytelnianie sieciowe, User Interface Architecture (Human Interface Infrastructure)
wymaga dysku z tablicą GPT i specjalną partycją ESP (EFI system partition) z systemem plików FAT (tablica 32-bitowa)
zalety
uruchamianie systemu z dużych dysków: od 2.2 TB (232 x 512=2 TiB) do 9.4 ZB (273 =8 ZiB)
obsługa pamięci dla systemów x86-32 oraz x86-64
szybsze uruchamianie systemu
architektura niezależna od CPU
moduły obsługi urządzeń (drivers) niezależne od CPU
elastyczne środowisko pre-SO (wsparcie sieciowe)
modułowa architektura
secure boot (od wersji 2.2)
tablice – UEFI dostarcza tablic z danymi dotyczącymi platformy sprzętowej oraz usług, które są dostępne dla programu ładującego i SO
boot services – wsparcie dla tekstowych i graficznych konsol na różnych urządzeniach, obsługa magistrali, urządzeń blokowych i plików
runtime services – dostęp do zmiennych, czasu, pamięci wirtualnej
protokoły – wszystkie moduły obsługi urządzeń muszą świadczyć usługi via protokoły, czyli specjalne zbiory programowych interfejsów wykorzystywanych do komunikacji między binarnymi modułami
moduły obsługi urządzeń – oprócz modułów zależnych od architektury specyfikacja EFI określa środowisko programów obsługi urządzeń niezależnych od architektury
boot manager – menadżer odpowiedzialny za wybór i uruchamienie systemu
operacyjnego (efibootmgr
pozwala manipulować jego konfiguracją, jeśli system
został uruchomiony via UEFI)
dyski – wsparcie dla tablic partycji MSDOS oraz GPT (GUID Partition Table)
nshell – powłoka EFI
rozszerzenia – rozszerzenia do EFI mogą być załadowane z dowolnej pamięci nieulotnej dostępnej w systemie
BIOS compatibility mode (CSM, Compatibility Support Module) – imitowanie BIOS-u i uruchamianie via MBR
programy ładujące współpracujące z EFI (zob. https://wiki.archlinux.org/index.php/UEFI_Bootloaders) umieszczane są we właściwych sobie podkatalogach katalogu EFI na systemowej partycji EFI (ESP, EFI System Partition, VFAT).
gdisk
pozwala utworzyć partycję ESP (po utworzeniu partycji trzeba jej typ określić jako EF00).
Odmiany:
dla systemów Windows
dla OS X
ELILO (od roku 2000), EFILINUX dla systemów Linux
GRUB Legacy (zmodyfikowany)
GRUB2 (w zależności od kompilacji) wspiera systemy BIOS i EFI
refind-efi, gummieboot – nie programy ładujące, ale zarządzające programami ładującymi
EFISTUB Kernel – jądro systemu jako swój własny progam ładujący (od wersji >= 3.3); CONFIG_EFI_STUB=y
Linux i Go – zastąpienie firmware-u w rodzaju Intel Management Engine przez jądro linuksowe; wszystkie czynności związane z procesem uruchamiania, które mogą być realizowane w trybie użytkownika są wykonywane przez program napisany w języku Go (zob. http://lwn.net/Articles/738649/)
Widoczne i niewidoczne systemy operacyjne:
Przyszłościowy(?) schemat uruchamiania systemu komputerowego:
Zob. https://schd.ws/hosted_files/osseu17/84/Replace%20UEFI%20with%20Linux.pdf.