PB 153 Operační systémy a jejich rozhraní1 Principy výstavby OS PB153 Operační systémy a jejich rozhraní PB 153 Operační systémy a jejich rozhraní2 Vnitřní struktura OS  Existuje řada přístupů a implementací  jedno velké monolitické jádro  modulární, hierarchický přístup  malé jádro a samostatné procesy  Struktura mnoha OS je poznamenána historií OS a původními záměry, které se mohou od současného stavu radikálně lišit PB 153 Operační systémy a jejich rozhraní3 Příklad: MS-DOS PB 153 Operační systémy a jejich rozhraní4 Příklad MS-DOS (2)  Při programování pro OS MS-DOS využíváme služeb  spuštěných rezidentních programů • např. ovladač myši (poskytuje služby na INT 33h)  operačního systému • např. přístup k souborům (INT 21h)  BIOSu • např. nastavení grafického režimu (INT 10h)  přímo HW • např. přímo zápis do videopaměti pro zobrazení dat PB 153 Operační systémy a jejich rozhraní5 Příklad MS-DOS (3)  Změna fontů v textovém režimu (bez využití služeb BIOSu, OS, přímo HW) asm cli; outport(0x3c4,0x0402); outport(0x3c4,0x0704); outport(0x3ce,0x0204); outport(0x3ce,0x0005); outport(0x3ce,0x0406); for(i=0;i<=254;i++) { for(j=0;j<=15;j++) {p=MK_FP(0xa000,32*i+j); *p=font[y]; y++; } } outport(0x3c4,0x0302); outport(0x3c4,0x0304); outport(0x3ce,0x0004); outport(0x3ce,0x1005); outport(0x3ce,0x0e06); asm sti; PB 153 Operační systémy a jejich rozhraní6 Příklad MS-DOS (4)  Hlavní cíl návrhu  maximální možná funkcionalita v co nejmenším prostoru  Výsledek  modulová architektura není aplikovaná  i když MS-DOS má jistou strukturu, jeho rozhraní a jednotlivé komponenty nejsou důsledně separovány a uspořádány PB 153 Operační systémy a jejich rozhraní7 Příklad UNIX  Také omezen hardwarem  vznik v polovině 70. let  OS Unix sestává ze 2 částí  systémové programy  jádro • vše, co se nachází pod rozhraním volání systému a nad fyzickým hardware • obstarává plnění funkcí z oblastí systému souborů, plánování CPU, správy paměti, … • vrstvová architektura sice existuje, ale hodně funkcí je na jedné úrovni PB 153 Operační systémy a jejich rozhraní8 Příklad UNIX (2) PB 153 Operační systémy a jejich rozhraní9 Příklad: UNIX (3) PB 153 Operační systémy a jejich rozhraní10 XENIX • V roce 1979 koupil Microsoft licenci na Unix verze 7 od AT&T. •V roce 1987 předal Microsft Xenix firmě SCO. •Koncem 80. let byl Xenix pravděpodobně nejrozšířenějším OS unixového typu podle počtu strojů, na kterých běžel. PB 153 Operační systémy a jejich rozhraní11 Příklad OS/2 PB 153 Operační systémy a jejich rozhraní12 Hierarchická vrstvová architektura  OS se dělí do jistého počtu vrstev (úrovní)  Každá vrstva je budována na funkcionalitě nižších vrstev  Nejnižší vrstva (0) je hardware  Nejvyšší vrstva je uživatelské rozhraní  Pomocí principu modulů jsou vrstvy vybírány tak, aby každá používala funkcí (operací) a služeb pouze vrstvy n – 1 PB 153 Operační systémy a jejich rozhraní13 Hierarchická architektura PB 153 Operační systémy a jejich rozhraní14 Hierarchická struktura  Řeší problém přílišné složitosti velkého systému  Provádí se dekompozice velkého problému na několik menších zvládnutelných problémů  Každá úroveň řeší konzistentní podmnožinu funkcí  Nižší vrstva nabízí vyšší vrstvě „primitivní“ funkce (služby)  Nižší vrstva nemůže požadovat provedení služeb vyšší vrstvy  Používají se přesně definovaná rozhraní  Jednu vrstvu lze uvnitř modifikovat, aniž to ovlivní ostatní vrstvy – princip modularity PB 153 Operační systémy a jejich rozhraní15 Hierarchická struktura  Výhodou je modularita OS  Nevýhodou je především vyšší režie a tím pomalejší vykonávání systémových volání  Protože efektivita hraje v jádře OS významnou roli je třeba volit kompromis  pouze omezený počet úrovní pokrývající vyšší funkcionalitu  příklad: první verze Windows NT měli hierarchickou strukturu s řadou vrstev, avšak pro zvýšení výkonu OS bylo ve verzi NT 4.0 rozhodnuto přesunout více funkcionality do jádra a sloučit některé vrstvy PB 153 Operační systémy a jejich rozhraní16 Příklad: Linux PB 153 Operační systémy a jejich rozhraní17 Provádění služeb v klasickém OS  Klasický OS (non-process kernel OS)  OS je prováděn jako samostatná entita v privilegovaném režimu  procesy – jen uživatelské programy  Služba se provádí jako součást jádra  Služba se provádí v rámci procesů  obecně lze celý OS provádět v kontextu uživatelského procesu • Leží v jeho adresovém prostoru  přerušení (volání služby OS) vyvolává implicitně pouze přepnutí režimu procesoru (z uživatelského do privilegovaného), ne změnu kontextu  k přepínání kontextu procesů dochází jen tehdy, je-li to nutné z hlediska plánování  pro volání procedur v rámci jádra se používá samostatný zásobník  program a data OS jsou ve sdíleném adresovém prostoru a sdílí je všechny uživatelské procesy PB 153 Operační systémy a jejich rozhraní18 Služby v procesově konstruovaném OS  OS je souhrnem systémových procesů  Jádro tyto systémové procesy separuje, ale umožňuje jim synchronizaci a komunikaci  Snaha o provádění co nejmenší části kódu v privilegovaném režimu procesoru  V krajním případě je jádro pouze ústředna pro přepojování zpráv  Takové řešení OS je snadno implementovatelné na multiprocesorových systémech  Malé jádro - mikrojádro PB 153 Operační systémy a jejich rozhraní19 Struktura s mikrojádrem  Microkernel System Structure  Malé jádro OS plnící pouze několik málo nezbytných funkcí  primitivní správa paměti (adresový prostor)  komunikace mezi procesy – Interprocess communication (IPC)  Většina funkcí z jádra se přesouvá do „uživatelské“ oblasti  ovladače HW zařízení, služby systému souborů, virtualizace paměti …  mezi uživatelskými procesy se komunikuje předáváním zpráv PB 153 Operační systémy a jejich rozhraní20 Struktura s mikrojádrem (2)  Výhody mikrojádra  snadná přenositelnost OS, jádro je malé  vyšší spolehlivost (moduly mají jasné API a jsou snadněji testovatelné)  vyšší bezpečnost (méně kódu OS běží v režimu jádra)  flexibilita (jednodušší modifikace, přidání, odebrání modulů)  všechny služby jsou poskytovány jednotně (výměnou zpráv)  Nevýhoda mikrojádra  zvýšená režie • volání služeb je nahrazeno výměnou zpráv mezi procesy PB 153 Operační systémy a jejich rozhraní21 Mikrojádro a monolitické jádro PB 153 Operační systémy a jejich rozhraní22 Mach  Klasickým příkladem OS s mikrojádrem je Mach vytvořený v 80. letech  Na přístupu Mach je založen např. Tru64 UNIX nebo realtimový OS QNX  Windows NT používají hybridní strukturu  jádro má vrstevnou strukturu a zajišťuje komunikaci aplikace se „servery“  pro jednotlivé typy aplikací (Win32, OS/2, POSIX) existují „servery“ běžící v uživatelském režimu PB 153 Operační systémy a jejich rozhraní23 Příklad: Windows NT PB 153 Operační systémy a jejich rozhraní24 Příklad: Windows NT (pokr.)  Další vývoj těchto subsystémů  OS/2 subsystém naposled ve Windows 2000  POSIX subsystém je v novějších Windows (ne variantách Home apod.) k dispozici ve formě „Subsystem for Unix-based Applications“ (SUA)  Win32 se nyní jmenuje Windows API • A zahrnuje také API na 64bitových systémech PB 153 Operační systémy a jejich rozhraní25 Linux: modularita  Do linuxového jádra můžeme při běhu přidávat kód – moduly  LKM – Loadable Kernel Module  Přesto je Linuxové jádro monolitické  Moduly běží stejně jako zbytek jádra v privilegovaném režimu  Jde o modularitu kódu jádra ne o modulární architekturu jádra (mikrojádro) PB 153 Operační systémy a jejich rozhraní26 Linux: modularita  LKM umožňují:  Přidávat funkčnost za běhu • Např. připojení nového USB zařízení  Snižují paměťové nároky jádra • Nahráváme jen moduly, které potřebujeme • Oproti speciálně zkompilovanému jádru však mají vyšší režii PB 153 Operační systémy a jejich rozhraní27 Linux: modularita  insmod, rmmod, lsmod, modinfo, depmod, modprobe PB 153 Operační systémy a jejich rozhraní28 Linux: modularita  Linux moduly obvykle nepodepisuje  Ale všímá si licence … PB 153 Operační systémy a jejich rozhraní29 Linux: modifikace jádra za běhu  /dev/kmem  Možnost přímo číst/měnit paměť jádra za běhu  Přístupné pouze pro administrátora, přesto nebezpečné  V řadě distribucí už /dev/kmem nenajdeme  LKM  Běží v privilegovaném režimu procesoru jako zbytek jádra  Možnost změny chování jádra  Rootkity PB 153 Operační systémy a jejich rozhraní30 Linux: tabulka systémových volání  Nejjednodušší způsob jak implementovat rootkit je modifikovat tabulku rutin obsluhujících systémová volání (sys_call_table) a navázat se na volání jako open, readdir, …  Snaha omezit možnost LKM modifikovat tabulku systémových volání  Dnes není tento symbol exportován a není tak možné ho v LKM přímo použít a získat tak ukazatel na tabulku PB 153 Operační systémy a jejich rozhraní31 Windows: modularita  Do jádra Windows můžeme za běhu vkládat ovladače  Ty běží v privilegovaném režimu jádra PB 153 Operační systémy a jejich rozhraní32 Windows: Modularita (př.) PB 153 Operační systémy a jejich rozhraní33 Ovladače ve Windows XP PB 153 Operační systémy a jejich rozhraní34 Ovladače a novější Windows PB 153 Operační systémy a jejich rozhraní35 Podpisy vyžadovány u 64bitových systémů PB 153 Operační systémy a jejich rozhraní36 Podpisy ovladačů  U Windows nejde při podepisování o čistotu jádra či licence  Jde především o  Spolehlivost systému – tj. kvalitu kódu běžícího v privilegovaném režimu  A s tím související bezpečnost jádra/systému  DRM (!)  User mode drivers – snaha snížit množství kódu běžící přímo v jádře PB 153 Operační systémy a jejich rozhraní37 Virtuální stroje  Virtuální stroj vytváří rozhraní identické s původním holým hardwarem  Operační systém vytváří iluzi více procesů, kde každý běží na svém vlastním procesoru se svou vlastní (virtuální) pamětí  může vytvářet iluzi více systémů • s vlastnostmi původního fyzického počítače nebo úplněji jiného stroje  každý uživatel na jediném stroji může tudíž provozovat jiný OS  virtuální stroje zajišťují úplnou ochranu systémových zdrojů • každý virtuální stroj je izolován od všech ostatních virtuálních strojů • to však ztěžuje komunikaci mezi virtuálními stroji  Ve virtuálním stroji může běžet virtuální stroj  • Usnadňuje to např. ladění OS během jeho provozování  Implementace virtuálních strojů není triviální PB 153 Operační systémy a jejich rozhraní38 Virtuální stroje (2) PB 153 Operační systémy a jejich rozhraní39 Virtualizace (příklad) PB 153 Operační systémy a jejich rozhraní40 Java Virtual Machine  Prostředí Java dosahuje nezávislosti na použité HW platformě pomocí JVM (Java Virtual Machine)  pro každou platformu je implementován JVM  kompilátor Java (javac) generuje „bytecode“ (ne přímo strojový kód určité architektury)  bytecode je interpretován JVM  V praxi to s HW/OS nezávislostí není zcela pravdivé  Problém rychlosti běhu  program v Javě se provádí pomaleji než obdobný program v C/C++  Řešení  Těsně před provedením kompiluje kompilátor JIT (Just In Time), bytecode do strojového kódu patřičné platformy  A nebo počítačové platformy, kde instrukce strojového kódu = bytecode PB 153 Operační systémy a jejich rozhraní41 Cíle návrhu systému  Cíle pro uživatele  OS musí být snadno použitelný, snadno naučitelný, spolehlivý, bezpečný, rychlý, …  Systémový cíl  OS se musí dát snadno navrhnout, implementovat, udržovat a musí být přizpůsobivý, spolehlivý, bezchybný, spolehlivý  Zkušenost s výsledky  Operační systémy jsou (a asi vždy budou) • Obrovské – až desítky milionů řádků zdrojového kódu • Složité • Asynchronní (interaktivní) • (vždy) plné chyb a (často) nespolehlivé • Silně závislé na konkrétním hardware – obtížně přenositelné PB 153 Operační systémy a jejich rozhraní42 Implementace systému  Tradičně býval OS napsaný v symbolickém strojovém jazyku (assembleru)  OS se stále častěji píší v běžných programovacích jazycích vysoké úrovně (obvykle C/C++)  lze naprogramovat rychleji  výsledek je kompaktnější  OS je srozumitelnější a lze ho snadněji ladit  je snadněji přenositelný na jinou architekturu PB 153 Operační systémy a jejich rozhraní43 System Generation (SYSGEN)  Operační systém je navržen tak, aby mohl běžet na jisté třídě architektur / sestav počítače  OS musí být konfigurovatelný na konkrétní sestavu  Program SYSGEN  Získává informace týkající se konkrétní konfigurace konkrétního hardwarového systému  Bootování  Spuštění činnosti počítače zavedením jádra a předáním řízení na vstupní bod jádra pro spuštění činnosti  Bootstrap program  Program uchovávaný v ROM, který je schopný naleznout jádro, zavést ho do paměti a spustit jeho provedení PB 153 Operační systémy a jejich rozhraní44 Bootování IBM PC  Řídí BIOS  provede se inicializace HW komponent  na základě uložené konfigurace zjistíme z kterého zařízení se má OS zavést  v případě pevného disku se spustí kód uložený v Master Boot Recordu (MBR) • tento kód například zjistí, která partition je aktivní a spustí boot sektor této partition. Kód uložený v boot sektoru načte soubory s jádrem OS do paměti • nebo např. LILO/Grub umožní interaktivně vybrat který OS bude zaveden (bootsektor které partition se má spustit?; kde je soubor s jádrem OS?) • tento kód může být delší než je délka MBR, musí pak být uložen v jiné oblasti disku PB 153 Operační systémy a jejich rozhraní45 Příklad: Bootování Linuxu (IBM PC)  BIOS kontroluje HW  Z vybraného zařízení se získá a spustí zavaděč („boot loader“)  Např. se z pevného disku přečte prvních 512 bajtů (tzv. MBR) a spustí se tento „kód“ (fáze 1). PB 153 Operační systémy a jejich rozhraní46 Hlavní zaváděcí záznam PB 153 Operační systémy a jejich rozhraní47 Příklad: Bootování Linuxu (IBM PC) - pokračování  Spuštění zavadeče  Ve volitelné fázi 1.5 se zavede kód pro přístup k disku (BIOS nemusí plně umět).  Ve fázi 2 se zavede zbytek kódu zavaděče.  Výběr OS a parametrů  GRUB je schopen pracovat s ext2, ext3, ext4 souborovými systémy  LILO souborové systémy nezná a pracuje s přímými adresami souborů na disku PB 153 Operační systémy a jejich rozhraní48 Výběr OS - GRUB PB 153 Operační systémy a jejich rozhraní49 Bootovaní Linuxu (IBM PC)  Spuštění jádra  Z disku je přečten obraz jádra  Tento obraz se dekomprimuje  Provede se základní inicializace (např. tabulka stránek paměti)  Spustí se jádro (volá se funkce start_kernel())  Jádro  Nastaví systém (ovladače přerušení, inicializace zařízení a ovladačů zařízení) a spustí plánovač.  Vytvoří proces Init (číslo procesu 1) – např. /sbin/init