1. diel - Assembler - Tvorba operačného systému - Online kurz
Vitajte v kurze tvorby operačného systému v Assembleri. V nasledujúcom tutoriále začneme pracovať na návrhu nášho vlastného jednoduchého OS. V priebehu kurzu sa postupne naučíme vytvoriť návrh systému – štruktúru OS, prácu s FS, pamäťou, výber médií a cieľového CPU. Vytvoríme vlastný bootloader a nakoniec aj to hlavné – jadro systému, ktorý potom bude schopný nabootovať a oživiť počítač.
Požiadavky pre úspešné absolvovanie kurzu
Aby sme kurzom úspešne prešli, budeme potrebovať:
- znalosť Assemblera aspoň na úrovni Základy assemblera
- znalosť hardvéru (pamäť, súborový systém, periférie) aspoň na úrovni kurzu Staviame si počítač
Bootovanie OS
Kvôli obmedzeniam Real Mode (mód práce procesora, vychádza z prapôvodnej architektúry x86, čo je 16 bitové rozšírenie mikroprocesora 8086 od Intelu) sa zavádzač systému rozdeľuje na aspoň dve časti. Tieto časti označujeme stage - fáza). Zavádzač sa totiž musel nachádzať na prvom sektore disku - s veľkosťou iba 512 B.
Prvá fáza (Stage 1) zavádzanie OS
Prvá fáza zavádzania, známa aj ako "boot sector" alebo "MBR (Master Boot Record)", je kľúčová pre inicializáciu bootovacieho procesu. Jej hlavnou úlohou je načítať a spustiť druhú fázu zavádzania. Prvá fáza je často veľmi jednoduchá kvôli obmedzeniu 512 bajtov, ktoré má k dispozícii.
Po zapnutí počítača vykoná firmvér, ako je BIOS alebo UEFI, POST (Power-On Self Test) a potom hľadá na disku bootovací sektor. Akonáhle BIOS nájde MBR (Master Boot Record), začne vykonávať inštrukcie v ňom obsiahnuté. V MBR je tiež často tabuľka rozdelenia disku, ktorá ukazuje, ako je disk rozdelený na oddiely. Ak máme viac operačných systémov na jednom disku, prvá fáza môže tiež obsahovať kód pre boot manager, ktorý umožňuje používateľom vybrať, ktorý OS chcú spustiť. Po dokončení svojich inštrukcií prvá fáza vyhľadá a načíta do pamäte druhú fázu zavádzania, ktorá potom prevezme kontrolu nad zavádzaním operačného systému.
Druhá fáza (Stage 2) zavádzanie OS
Druhá fáza zavádzania OS spravidla získa od BIOSu dôležité informácie o systéme (mapa pamäte, informácie o procesore atď.), a tieto informácie si uloží pre následné odovzdanie kernela (jadra celého systému). Ďalej druhá fáza pripravuje procesor (a popr. aj ďalšie zariadenia) na štart a správne fungovanie.
Inicializácia OS
Po tom, čo zavádzač (bootloader) dokončí svoju prácu a odovzdá kontrolu nad počítačom kernela, sme stále ešte ďaleko od privítania obrazovkou nabádajúcou nás k prihláseniu.
Operačný systém totiž ešte musí inicializovať mnoho rôznych zariadení, musí si zmapovať fyzickú pamäť, nájsť ďalšie pripojené zariadenia a mnoho ďalšieho.
Teraz, keď sme si prešli postupom, ako sa operačný systém bootuje a inicializuje, je zrejmé, že jadro je kľúčovou zložkou celého systému. Inicializácia OS pripravuje počítač na oživenie, ale jadro je tým, čo skutočne riadi všetky funkcie operačného systému.
Návrh jadra OS
Návrh OS záleží na rozhodnutí vývojárov. Niektoré návrhy sú jednoduchšie na implementáciu, niektoré sú zase rýchlejšie a stabilnejšie, a niektoré zase pre špecifické použitie. Tá najdôležitejšia časť návrhu sa týka rozhodnutia o type kernelu - jadra systému.
Jadro systému spravuje dostupné prostriedky (napr. alokuje pamäť RAM pre programy), komunikuje s hardvérom, alebo zaisťuje správne zabezpečenie pamäte programov. Pozrime sa na rôzne návrhy jadier OS, ich výhody, nevýhody, a nakoniec si aj vyberieme návrh nášho vlastného OS.
Monolithic Kernel (Monolitické Jadro)
Monolitické jadro obsahuje všetky svoje služby v "jednom balíčku", obvykle súboru. Všetky základné ovládače hardvéru sú obsiahnuté priamo v samotnom jadre, čo značne zvyšuje rýchlosť OS a znižuje potrebu posielania správ medzi jednotlivými procesmi.
Výhodou monolitického jadra je hlavne jeho rýchlosť. Naopak nevýhodné sú jeho náchylnosť k zrúteniu systému vplyvom jedinej chyby a nutnosť povoliť väčšiemu objemu kódu beh s najvyššou prioritou (oprávnením), čo je potenciálne rizikové s ohľadom na bezpečnostné diery.
Systémy, ktoré tento typ jadra využívajú (oi):
- Linux (ale moderné distribúcie často používajú moduly pre rozšíriteľnosť),
- MS-DOS,
- Unix (tradičné varianty).
Mikrojadro drvivú väčšinu svojich služieb vykonáva ako servery bežiace v užívateľskom priestore. Mikrojadro zariaďuje iba alokáciu pamäte (s tým, že samotný správca pamäte môže byť samostatný server), medzi-procesovú komunikáciu (Inter Process Communication - IPC) a podľa potreby aj niektoré ďalšie veci.
Keď hovoríme o mikrojadre, tak slovom server nemyslíme vzdialený internetový server, ale lokálny program (daemon), ktorý komunikuje s jadrom na určitom sockete.
Výhodou mikrojadra je väčšia stabilita systému, nevýhodou je potom nižšia rýchlosť vplyvom IPC (komunikácia medzi procesmi). Návrh systému založeného na mikrojadre je tiež pomerne náročný.
Systémy, ktoré tento typ jadra využívajú (oi):
- Minix,
- QNX,
- Mach (používaný v skorých verziách macOS).
Väčšina operačných systémov v dnešnej dobe si prispôsobuje princípy oboch vyššie spomínaných typov kernela. Vývojári sa môžu napr. rozhodnúť ponechať VFS (Virtual FileSystem) pre jeho jednoduchšie použitie v jadre, zatiaľ čo ovládače pre jednotlivé súborové systémy nadesignujú do užívateľského priestoru.
Tento spôsob návrhu kernela sa považuje za hybrid medzi monolitickým jadrom a mikrojadrom. Cieľom je primárne získanie čo najvyššej rýchlosti a súčasne čo najvyššej bezpečnosti kódu.
Systémy, ktoré tento typ jadra využívajú (oi):
- Windows NT (a jeho následníky, vrátane Windows 10)
- Moderný macOS (na báze XNU, čo je hybrid Mach mikrojadra a častí z FreeBSD monolitického jadra)
Okrem vyššie spomínaných návrhov existujú aj ďalšie, napríklad modulárne jadro. To na rozdiel od hybridného jadra alebo mikrojadra, ktoré načítajú spravidla iba známy kód (resp. moduly), načíta akýkoľvek modul vrátane neznámych priamo do jadra.
Systémy, ktoré tento typ jadra využívajú (oi):
- Moderný Linux (v tom zmysle, že podporuje načítanie a odnačítanie modulov za behu)
Nanojadro
Tento typ kernela je extrémnou verziou mikrojadra. Jadro samotné obsahuje iba pár ovládačov (väčšinou iba pre 8259 PIC a časovače), zvyšok je spustený ako server. Tento typ kernela je skôr teoretický koncept.
Exojadro
Pravým opakom mikrojadra je exojadro. Charakterizuje ho takmer žiadna abstrakcia hardvéru. Tá sa programom dostáva napr. pomocou programovej knižnice.
Systémy, ktoré tento typ jadra využívajú (oi):
- ExOS
Hoci je tu niekoľko OS uvedených pod konkrétnym typom jadra, je dôležité si uvedomiť, že návrh jadra je kontinuálne spektrum, kde môže mať konkrétny operačný systém rysy viac ako jedného z týchto typov.
Dva posledné typy kernela nie sú časté a majú viac nevýhod ako výhod. My si pri návrhu OS budeme vyberať medzi monolitickým jadrom, mikrojadrom, alebo jadrom hybridným.
V budúcej lekcii, Assembler - Zásobník , si povieme o tom, čo je to zásobník, ako sa dá používať, a na čo si dať pozor, keď s ním pracujeme.