Uruchamianie systemu

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.

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.

    ../../../_images/bootchain.png

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:

    ../../../_images/2.5-kernels.png

    Przyszłościowy(?) schemat uruchamiania systemu komputerowego:

    ../../../_images/linux-boot.png ../../../_images/uefi-standard-boot.png

    Zob. https://schd.ws/hosted_files/osseu17/84/Replace%20UEFI%20with%20Linux.pdf.