MINIX 3 je projekt s cílem vytvořit malý, vysoce spolehlivý a funkční Unix-like operační systém. Je zveřejněn pod licencí BSD a je nástupcem dřívějších operačních systémů MINIX 1 a 2.

Hlavním cílem tohoto systému je, aby byl odolný proti chybám, za pomoci detekce a oprav sama sebe, za běhu, bez nutnosti zásahu uživatele. Jako hlavní použití tohoto operačního systému se očekávají vestavěné systémy a vzdělávání.

MINIX 3 v současné době podporuje IA-32 a ARM architektury systémů. Je také možné spustit MINIX pod emulátory nebo virtuálními stroji, jako jsou Bochs, VMware Workstation, Microsoft Virtual PC, Oracle VirtualBox a QEMU. Porty na architektury ARM a PowerPC jsou ve vývoji.

Distribuci je možné získat na live CD a také ji lze stáhnout ve formátu vhodném pro USB flash disk. Nejnovější verze je 3.4.0rc6 z 9. května 2017.

Cíle projektu náhled|Struktura monolitického jádra a na mikrokernelu-založeném operačním systému.

V kontrastu k systémům založeným na monolitickém jádře, kde ovladače (které mají podle tvůrce MINIXu Tanenbauma, přibližně 3–7krát více chyb než obvyklý program) mohou vyřadit z provozu celý systém, MINIX 3 si klade za cíl vytvořit operační systém, který je "spolehlivý, samoopravný, multiserverový klon UNIXu".

V zájmu dosažení minimalizace kódu běžícího v jádře systému, byl realizován s file serverem, proces serverem a všemi ovladači zařízení běžícími jako samostatné procesy v uživatelském režimu. Každý ovladač je bedlivě sledován součástí systému známou jako reinkarnační server. Pokud ovladač nereaguje na ping od reinkarnačního serveru, je vypnut a nahrazen novou kopií ovladače.

V monolitickém systému může chyba v ovladači snadno shodit celé jádro, což je v MINIXu 3 mnohem méně pravděpodobné.

Historie Verze MINIXu 3 Verze Datum vydání Popis 3.1.02005-10-24 První vydaná verze MINIXu 3 (knižní vydání). 3.1.2a2006-05-29 Nový správce balíčků Packman. Oprava chyby při instalaci s auto-partitioningem disků. 3.1.32007-04-13 Přidán nový virtuální souborový systém 3.1.3a2007-06-08 Opravy chyb. 3.1.42009-06-09 Podpora virtuální paměti. Vylepšena podpora virtuální stroje (když MINIX běží jako virtuální stroj). 3.1.52009-11-05 Vylepšení výkonnosti Sdílená paměť funkce setitimer souborový systém ISO 9660 Open Sound System Nyní funguje past na neplatné (NULL) přístupy, pro pohodlí uživatele Vylepšená obsluha signálů Lepší podpora debuggerů (vylepšení ptrace, atd.) Autodetekce síťové karty (pro podporované PCI karty), vylepšena síťová konfigurace 3.1.62010-02-08 Nové síťové ovladače: Atheros L2, Intel E1000, Realtek 8169, DEC Tulip PipeFS – odstraněna obsluha pipe z ovladačů souborů HGFS – podpora pro přidávání VMware sdílené adresáře, jako souborový systém VFS: podpůrná skupinová podpora a podpora sticky bitu Podpora matematického koprocesoru System Event Framework (SEF) Experimental podpora řadiče přerušení APIC 3.1.72010-06-16 Plánování uživatelského prostoru a plánovacího serveru Náležitá podpora pro několik ethernetových karet stejného typu Bootovací monitor umožňující nahrávání obrazů > 16 MB Buildsystem podporuje MINIX s GCC Podpora pro znakové stránky cp1251 a koi8-u 3.1.82010-10-04 Nový infrastruktura pro spravování: pkgsrc a pkgin Podpora unix socketu Podpora multibootu Podpora ext2 Ovladač ACPI Úplný APIC mód zahrnující I/O APICs Experimentální podpora AHCI 3.2.02012-02-29 Na MINIX 3 portován GNU Debugger a implementována podpora výpisu jádra Podpora FUSE s experimentálním souborovým systémem NTFS-3G Postupné nahrazování userlandu MINIXu userlandem (aplikacemi) NetBSD Nahrazení výchozího kompilátoru ACK Clangem (přitom GCC je také podporován) Přepnutí na knihovny ELF a NetBSD libc Pkgsrc nahrávání a přenášení applikací Asynchronní virtual filesystem (VFS) server. Nahrazení bootloaderu MINIXu bootloaderem NetBSD Podpora NCQ v ovladači AHCI 3.2.1 2013-02-21 Podpora pro dynamicky připojované knihovny (DLL) Odstranění segmentů Intel Odebrána podpora binárek a.out Podpora křížové kompilace Podpora Device Driver Environment kitu VBFS – podpora pro připojování VirtualBox Shared Folder jako souborového systému 3.3.0 2014-09-16 Podpora architektury ARM (křížem-kompilovatelné) Podpora pro mechanizmus mmap() I/O. Umožňuje sdílet dynamické knihovny a zmenšuje paměťový otisk. Nová architektura vstupu: vstupní server a ovladač klávesnice je oddělen od TTY VND: vnode disk (loopback) blokový ovladač LLVM Bitcode sestaven na tomto systému Import LLVM / clang ve zdrojích Unifikovaný blokový buffer sdílen s FS a VM Zlepšena kompatibilita s NetBSD (utility, volání, typy (mnoho 64bitových), toolchain, codebase, a balíčky) Ve zprávách používány typy jazyka C. Čistší. Vylepšená modularita ovladačů: UDS oddělen od PFS, PTY od TTY, jeden řadič na instanci at_wini, z bootovacího obrazu odebrán LOG. Balíčky jsou nyní dynamicky připojované 3.4.0 rc6 2017-05-09 X11 je součástí operačního systému

MINIX 3 byl veřejně uveden dne 24. října 2005 Andrewem Tanenbaumem, během jeho projevu konference ACM Symposium Operating Systems Principles. I když MINIX 3 stále slouží jako příklad pro nové vydání učebnice Tanenbauma a Woodhulla, je komplexně přepracován, aby byl "použitelný jako seriózní systém pro počítače s omezenými zdroji, vestavěné systémy a pro aplikace vyžadující vysokou spolehlivost."

O MINIX 3 se zajímal Intel prostřednictvím svého týmu inženýrů, který Tanenbauma kontaktoval. Kromě technických dotazů se inženýři Intelu dotazovali i na množství úprav MINIXu, např. na snížení paměťové náročnosti, přidání #ifdefs do částí kódu, aby byly označitelné v konfiguračních souborech. Díky těmto úpravám se stal MINIX 3 ještě více modulárnějším, než byl do té doby. Po té Tanenbaumova spolupráce s Intelem na několik let ustala. Později se ukázalo, že MINIX 3 byl využit jako operační systém v rámci Intel Management Engine 11, což z MINIXu učinilo patrně nejpoužívanější operační systém na světě.

Spolehlivost v MINIXu 3 Jedním z hlavních cílů MINIXu 3 je spolehlivost. Níže jsou rozebírány některé z důležitých zásad, které ji u MINIXu 3 zvyšují.

Snížit velikost jádra Monolitické operační systémy, jako jsou Linux a FreeBSD, a hybridy, jako jsou Windows mají miliony řádků jádra kódu. V kontrastu s tím má MINIX 3 přibližně 6000 řádků spustitelného kódu jádra, což může pomoci při hledání chyby v kódu.

Izolovat chyby V monolitických jádrech jsou ovladače zařízení umístěny v samotném jádře. To znamená, že když je nová periferie nainstalována, je neznámý, neověřený kód vložen do jádra. Jeden chybný řádek kódu v ovladači může způsobit pád systému.

V MINIXu 3 je každý ovladač zařízení samostatným procesem, běžícím v uživatelském režimu. Ovladače nemohou vykonávat privilegované instrukce, měnit tabulky stránek, provádět libovolné vstupy/výstupy (I/O) a zapisovat do nestránkované paměti. Služby musí žádat jádro o povolení.

Omezit ovladačům přístup do paměti V monolitických jádrech může ovladač napsat jakékoliv slovo do paměti a omylem tak poškodit uživatelské programy.

V MINIXu 3, když například uživatel očekává data od souborového systému, vytváří popisovač (deskriptor) určující, kdo má přístup a na jaké adresy. Ten pak poskytne index pro tento popisovač souborového systému, který mohou předat ovladači. Tento souborový systém nebo ovladač se pak ptá jádra, zda může zapsat prostřednictvím popisovače, takže je pro něj nemožné zapsat na adresy mimo vyrovnávací paměť (buffer).

Přežít neplatné ukazatele Dereferencing neplatného ukazatele během práce ovladače nabourá ovladač procesu, ale nebude mít žádný vliv na systém jako celek. Reinkarnační server bude havarovaný ovladač automaticky restartovat. Pro některé ovladače (např., disku a sítě) je oživení pro uživatelské procesy transparentní. Pro ostatní (např. audio a tiskárny), si jich uživatel může všimnout. V monolitických jádrech dereferencing neplatného ukazatele v ovladači vede obvykle k havárii systému.

Zkrotit nekonečné smyčky Pokud se ovladač dostane do nekonečné smyčky, bude plánovač postupně snižovat jeho prioritu, až se stane nečinným. Nakonec reinkarnační server bude vidět, že ovladač nereaguje na stav žádosti, tedy ho odstraní a restartuje. V monolitickém jádru zacyklený ovladač může zastavit systém.

Omezení poškození od přetečení vyrovnávací paměti MINIX 3 využívá pro interní komunikaci pevné délky zpráv, která eliminuje některá přetečení vyrovnávací paměti (bufferu) a problémů s jejím řízením. Také mnohé exploity využívají princip přetečení vyrovnávací paměti, aby trikem podvrhly programu pro návrat z volání funkce pomocí přepsání zásobníku návratovou adresu ukazující do útočníkem ovládané paměti, obvykle přetečení vyrovnávací paměti sám způsobí. V MINIXu 3 je riziko tohoto útoku zmírněno, protože instrukce a data jsou rozdělena a pouze kód (který je pouze pro čtení) může být proveden. Toto je běžně známé jako Data Execution Prevention.

Omezit přístup k funkcím jádra Ovladače zařízení získávají služby kernelu (např. kopírování dat do uživatelského adresního prostoru), a to pomocí volání jádra. Jádro MINIXu 3 má bitovou mapu pro každý ovladač, který upřesňuje, které volání je oprávněn dělat. V monolitických jádrech může každý ovladač volat každou funkci jádra, oprávněnou či nikoliv.

Omezit přístup k I/O portům Jádro také udržuje tabulku popisující, které I/O porty může jednotlivý ovladač použít. Výsledkem je, že ovladač může přistupovat jen ke svým vlastním I/O portům. V monolitických jádrech může mít chybný ovladač přístup k I/O portům, které přísluší jinému zařízení.

Omezit komunikaci s komponenty OS Ne každý ovladač a server musí komunikovat s každými ostatními ovladači a servery. Proto má každý proces bitovou mapu, která určuje, které destinaci může jednotlivý proces poslat.

Reinkarnace mrtvých nebo poškozených ovladačů Speciální proces, nazvaný reinkarnační server, pravidelně dotazuje (ping) každý ovladač zařízení. Pokud ovladač havaruje, nebo nedokáže správně reagovat na dotaz, reinkarnační server jej automaticky nahradí novou kopii. Detekce a výměna nefunkčního ovladače je automatická, bez potřeby zásahu uživatele. Tato funkce v současné době nefunguje pro ovladače disků, ale v příští verzi bude systém schopen obnovit i ovladače disku, který bude ve stínu v random-access memory (RAM). Obnova ovladačů nemá vliv na běžící procesy.

Integrovat přerušení a zprávy Když nastane přerušení, je na nízké úrovni převedeno na zprávu zaslanou příslušnému ovladači. Pokud ovladač čeká na zprávu, dostane přerušení okamžitě, jinak dostane upozornění, že příště OBDRŽÍ zprávu. Toto schéma eliminuje vnořená přerušení a dělá programování ovladače jednodušší.

Architektura náhled|400x400pixelů|Architektura MINIXu 3 Jak lze vidět, na spodní úrovni je mikrokernel, což je asi 4000 řádků kódu (většinou v programovacím jazyce C, plus malé množství Assembleru). Zpracovává přerušení, plánování a předávání zpráv. Jeho API také podporuje asi 30 jaderných volání, které mohou autorizované servery a ovladače realizovat. Uživatelské programy nemohou tato volání použít. Místo toho mohou používat POSIXová systémová volání, která mohou odeslat zprávy na servery. Jaderná volání provádějí funkce jako je nastavení přerušení a kopírování dat mezi adresními prostory.

Na další úrovni, jsou tu ovladače zařízení, každé z nich běží jako samostatný uživatelský proces. Každý z nich ovládá některé I/O zařízení, jako je například disk nebo tiskárna. Ovladače nemají přístup k I/O prostoru a nemohou provádět I/O instrukce přímo. Místo toho musí ovladače provést volání jádra se seznamem I/O portů hodnot určených pro zapsání. Zatímco tam je malé množství režie (typicky 500 ns), tento systém umožňuje, aby jádro zkontrolovalo, zda má ovladač povolení. Aby například audio ovladač nemohl zapisovat na disk.