Lekce 1 - Assembler - Tvorba operačního systému - Online kurz
Vítejte v kurzu tvorby operačního systému v Assembleru. V následujícím tutoriálu začneme pracovat na návrhu našeho vlastního jednoduchého OS. V průběhu kurzu se postupně naučíme vytvořit návrh systému - strukturu OS, práce s FS, pamětí, výběr médií a cílového CPU. Vytvoříme vlastní bootloader a nakonec i to hlavní - jádro systému, který pak bude schopen nabootovat a oživit počítač.
Požadavky pro úspěšné absolvování kurzu
Abychom kurzem úspěšně prošli, budeme potřebovat:
- znalost Assembleru alespoň na úrovni Základy assembleru,
- znalost hardware (paměť, souborový systém, periferie) alespoň na úrovni kurzu Stavíme si počítač.
Ještě před samotným návrhem se ale musíme podívat na to, jak vlastně procesor funguje od samotného stisknutí tlačítka na zapnutí počítače, až do doby, kdy na obrazovce vidíme přihlašovací dialog.
Bootování OS
Kvůli omezením Real Mode (mód práce procesoru, vychází z prapůvodní architektury x86, což je 16 bitové rozšíření mikroprocesoru 8086 od Intelu) se zavaděč systému rozděluje na aspoň dvě části. Tyto části označujeme stage - fáze). Zavaděč se totiž musel nacházet na prvním sektoru disku - o velikosti pouze 512 B.
První fáze (Stage 1) zavádění OS
První fáze zavádění, známá také jako "boot sector" nebo "MBR (Master Boot Record)", je klíčová pro inicializaci bootovacího procesu. Její hlavní úlohou je načíst a spustit druhou fázi zavádění. První fáze je často velmi jednoduchá kvůli omezení 512 bajtů, které má k dispozici.
Po zapnutí počítače provede firmware, jako je BIOS nebo UEFI, POST (Power-On Self Test) a poté hledá na disku bootovací sektor. Jakmile BIOS najde MBR (Master Boot Record), začne vykonávat instrukce v něm obsažené. V MBR je také často tabulka rozdělení disku, která ukazuje, jak je disk rozdělen na oddíly. Pokud máme více operačních systémů na jednom disku, první fáze může také obsahovat kód pro boot manager, který umožňuje uživatelům vybrat, který OS chtějí spustit. Po dokončení svých instrukcí první fáze vyhledá a načte do paměti druhou fázi zavádění, která poté převezme kontrolu nad zaváděním operačního systému.
Druhá fáze (Stage 2) zavádění OS
Druhá fáze zavádění OS zpravidla získá od BIOSu důležité informace o systému (mapa paměti, informace o procesoru atd.), a tyto informace si uloží pro následné předání kernelu (jádru celého systému). Dále druhá fáze připravuje procesor (a popř. i další zařízení) ke startu a správnému fungování.
Inicializace OS
Po tom, co zavaděč (bootloader) dokončí svou práci a odevzdá kontrolu nad počítačem kernelu, jsme pořád ještě docela daleko od přivítání obrazovkou vybízející nás k přihlášení.
Operační systém totiž ještě musí inicializovat mnoho různých zařízení, musí si zmapovat fyzickou paměť, najít další připojená zařízení a mnoho dalšího.
Nyní, když jsme si prošli postupem, jak se operační systém bootuje a inicializuje, je zřejmé, že jádro je klíčovou složkou celého systému. Inicializace OS připravuje počítač k oživení, ale jádro je tím, co skutečně řídí všechny funkce operačního systému.
Návrh jádra OS
Návrh OS záleží na rozhodnutí vývojáře. Některé návrhy jsou jednodušší k implementaci, některé jsou zase rychlejší a stabilnější, a některé zase pro specifické použití. Ta nejdůležitější část návrhu se týká rozhodnutí o typu kernelu - jádra systému.
Jádro systému spravuje dostupné prostředky (např. alokuje paměť RAM pro programy), komunikuje s hardwarem, nebo zajišťuje správné zabezpečení paměti programů. Podívejme se na různé návrhy jader OS, jejich výhody, nevýhody, a nakonec si i vybereme návrh našeho vlastního OS.
Monolithic Kernel (Monolitické Jádro)
Monolitické jádro obsahuje všechny své služby v "jednom balíčku", obvykle souboru. Všechny základní ovladače hardware jsou obsaženy přímo v samotném jádru, což značně zvyšuje rychlost OS a snižuje potřebu posílání zpráv mezi jednotlivými procesy.
Výhodou monolitického jádra je hlavně jeho rychlost. Naopak nevýhodné jsou jeho náchylnost ke zhroucení systému vlivem jediné chyby a nutnost povolit většímu objemu kódu běh s nejvyšší prioritou (oprávněním), což je potenciálně rizikové s ohledem na bezpečnostní díry.
Systémy, které tento typ jádra využívají (mj.):
- Linux (ale moderní distribuce často používají moduly pro rozšířitelnost),
- MS-DOS,
- Unix (tradiční varianty).
Microkernel (Mikrojádro)
Mikrojádro drtivou většinu svých služeb vykonává jako servery běžící v uživatelském prostoru. Mikrojádro zařizuje pouze alokaci paměti (s tím, že samotný správce paměti může být samostatný server), mezi-procesovou komunikace (Inter Process Communication - IPC) a podle potřeby i některé další věci.
Když mluvíme o mikrojádru, tak slovem server nemyslíme vzdálený internetový server, ale lokální program (daemon), který komunikuje s jádrem na určitém socketu.
Výhodou mikrojádra je větší stabilita systému, nevýhodou je pak nižší rychlost vlivem IPC (komunikace mezi procesy). Návrh systému založeného na mikrojádru je také poměrně náročný.
Systémy, které tento typ jádra využívají (mj.):
- Minix,
- QNX,
- Mach (používaný v raných verzích macOS).
Moderní hybridy
Většina operačních systémů v dnešní době si přizpůsobuje principy obou výše zmíněných typů kernelu. Vývojáři se mohou např. rozhodnout ponechat VFS (Virtual FileSystem) pro jeho jednodušší použití v jádru, zatímco ovladače pro jednotlivé souborové systémy nadesignují do uživatelského prostoru.
Tento způsob návrhu kernelu se považuje za hybrid mezi monolitickým jádrem a mikrojádrem. Cílem je primárně získání co nejvyšší rychlosti a současně co nejvyšší bezpečnosti kódu.
Systémy, které tento typ jádra využívají (mj.):
- Windows NT (a jeho následníky, včetně Windows 10)
- Moderní macOS (na bázi XNU, což je hybrid Mach mikrojádra a částí z FreeBSD monolitického jádra)
Modulární jádro
Kromě výše zmíněných návrhů existují i další, například modulární jádro. To na rozdíl od hybridního jádra nebo mikrojádra, které načítají zpravidla pouze známý kód (resp. moduly), načte jakýkoliv modul včetně neznámých přímo do jádra.
Systémy, které tento typ jádra využívají (mj.):
- Moderní Linux (v tom smyslu, že podporuje načítání a odnačítání modulů za běhu)
Nanojádro
Tento typ kernelu je extrémní verzí mikrojádra. Jádro samotné obsahuje jenom pár ovladačů (většinou pouze pro 8259 PIC a časovače), zbytek je spuštěn jako server. Tento typ kernelu je spíše teoretický koncept.
Exojádro
Pravým opakem mikrojádra je exojádro. Charakterizuje ho téměř žádná abstrakce hardwaru. Ta se programům dostává např. pomocí programové knihovny.
Systémy, které tento typ jádra využívají (mj.):
- ExOS
Přestože je zde několik OS uvedených pod konkrétním typem jádra, je důležité si uvědomit, že návrh jádra je kontinuální spektrum, kde může mít konkrétní operační systém rysy více než jednoho z těchto typů.
Dva poslední typy kernelu nejsou časté a mají více nevýhod než výhod. My si při návrhu OS budeme vybírat mezi monolitickým jádrem, mikrojádrem, nebo jádrem hybridním.