===== Architektura jádra Linux ===== Jádro Linuxu (kernel) je monolitické jádro s modulární strukturou, které představuje srdce operačního systému. Poskytuje hardwarovou abstrakci, správu systémových prostředků a základní služby pro běžící programy. ===== Základní charakteristika ===== Linux kernel je monolitický, což znamená, že všechny základní služby (správa paměti, souborové systémy, ovladače) běží v privilegovaném režimu v jediném adresovém prostoru jádra. Na rozdíl od mikrojader (jako Minix nebo QNX) není funkcionalita rozdělena do samostatných serverových procesů. Přesto Linux podporuje dynamické načítání modulů, což mu dává flexibilitu podobnou mikrojádrům. ===== Vrstvy architektury ===== ==== 1. Hardwarová vrstva ==== Nejnižší úroveň představuje fyzický hardware - procesor, paměť RAM, disky, síťové karty, periférie. S touto vrstvou komunikuje jádro prostřednictvím specifických instrukcí a portů. ==== 2. Rozhraní System Call Interface (SCI) ==== Toto rozhraní poskytuje systémová volání (syscalls), která umožňují uživatelským programům požádat jádro o služby. Systémová volání jsou jediným legálním způsobem, jak může uživatelský proces přistupovat k privilegovaným operacím. Příklady systémových volání: ''open()'', ''read()'', ''write()'', ''close()'' - práce se soubory ''fork()'', ''exec()'', ''exit()'' - správa procesů ''socket()'', ''connect()'', ''send()'' - síťová komunikace ''mmap()'', ''brk()'' - správa paměti Systémové volání probíhá přepnutím z user mode (neprivilegovaný) do kernel mode (privilegovaný) pomocí speciální instrukce procesoru (např. ''int 0x80'' na x86 nebo ''syscall'' na x86-64). ==== 3. Vrstva správy procesů ==== === Process Scheduler (plánovač procesů) === Linux používá Completely Fair Scheduler (CFS) zavedený v jádře 2.6.23. CFS se snaží spravedlivě rozdělit procesorový čas mezi všechny procesy podle jejich priority a "nice" hodnoty. Klíčové koncepty: Virtual runtime (vruntime) - sleduje, kolik procesorového času proces už obdržel Red-black tree - procesy jsou organizovány v červeno-černém stromu podle vruntime, proces s nejnižším vruntime běží jako první Time slices - CFS nedělí čas na pevné časové kvanta, ale dynamicky přiděluje čas podle zatížení Prioritní třídy - real-time (SCHED_FIFO, SCHED_RR), normální (SCHED_NORMAL), dávkové (SCHED_BATCH), idle (SCHED_IDLE) === Process Management === Každý proces v Linuxu je reprezentován strukturou ''task_struct'', která obsahuje: PID (Process ID) a PPID (Parent Process ID) Stav procesu (running, sleeping, stopped, zombie) Registry procesoru a ukazatel zásobníku Informace o paměťovém prostoru (mm_struct) Seznam otevřených souborů Práva a oprávnění (UID, GID) Signály a jejich obsluhy Linux používá copy-on-write mechanismus při ''fork()'' - nový proces sdílí paměťové stránky s rodičem, dokud některý z nich nezačne do paměti zapisovat. ==== 4. Vrstva správy paměti (Memory Management) ==== === Virtuální paměť === Linux implementuje stránkování (paging) - virtuální adresový prostor je rozdělen na stránky (typicky 4 KB na x86). Každý proces má vlastní virtuální adresový prostor (typicky 0x00000000 až 0xFFFFFFFF na 32-bit systémech), který je mapován na fyzickou RAM. Page tables (tabulky stránek) překládají virtuální adresy na fyzické. Linux používá víceúrovňový systém: PGD (Page Global Directory) - nejvyšší úroveň PUD (Page Upper Directory) PMD (Page Middle Directory) PTE (Page Table Entry) - nejnižší úroveň, obsahuje fyzickou adresu === Zóny paměti === Fyzická paměť je rozdělena do zón: ZONE_DMA - paměť pro přímý přístup starších zařízení (0-16 MB na x86) ZONE_NORMAL - běžně použitelná paměť (16 MB - 896 MB na 32-bit x86) ZONE_HIGHMEM - vysoká paměť (nad 896 MB na 32-bit systémech) ZONE_MOVABLE - paměť pro přemístitelné stránky === Alokátory paměti === Buddy allocator - alokuje bloky fyzické paměti v mocninách 2 (4K, 8K, 16K...), efektivně předchází fragmentaci Slab allocator (SLUB v novějších jádrech) - cachuje často používané objekty (např. task_struct, inode), minimalizuje overhead alokace Vmalloc - alokuje virtuálně souvislou paměť (fyzicky může být fragmentovaná) Kmalloc - rychlá alokace malých bloků, fyzicky i virtuálně souvislá paměť === Page cache a buffer cache === Page cache - cachuje obsah souborů v paměti, zrychluje čtení a zápis Buffer cache - cachuje bloková data z diskových zařízení Linux používá jednotný page cache od verze 2.4 === Swapping a paging === Když dojde fyzická paměť, kswapd daemon začne přesouvat nejméně používané stránky na disk (swap partition/file). Algoritmus LRU (Least Recently Used) s modifikacemi určuje, které stránky vyměnit. OOM Killer (Out of Memory Killer) zabíjí procesy, když dojde paměť a swapping nestačí. ==== 5. Vrstva správy souborových systémů ==== === Virtual File System (VFS) === VFS je abstraktní vrstva, která poskytuje jednotné rozhraní pro různé souborové systémy (ext4, XFS, Btrfs, NFS, procfs, sysfs...). Uživatelské programy používají standardní funkce (open, read, write) bez znalosti konkrétního souborového systému. Klíčové struktury VFS: superblock - reprezentuje připojený souborový systém inode - reprezentuje soubor nebo adresář (metadata: oprávnění, velikost, časové razítka) dentry (directory entry) - reprezentuje položku v adresáři, spojuje název souboru s inodem file - reprezentuje otevřený soubor (obsahuje ukazatel na aktuální pozici) === Dentry cache (dcache) === Cachuje nedávno používané dentry objekty v paměti, výrazně zrychluje operace s cestami (path lookup). === Inode cache (icache) === Cachuje inode struktury, aby se nemusel při každém přístupu číst disk. === Konkrétní souborové systémy === ext4 - výchozí FS na mnoha Linuxových distribucích, journaling, extenty, velké soubory (až 16 TB) XFS - vysoce výkonný, škáluje na petabyty, dobré pro velké soubory Btrfs - moderní copy-on-write FS, snapshoty, RAID, komprese F2FS - optimalizováno pro flash paměti NFS, CIFS/SMB - síťové souborové systémy procfs, sysfs - virtuální souborové systémy pro informace o jádře ==== 6. Block I/O vrstva ==== Tato vrstva zprostředkovává komunikaci mezi souborovými systémy a blokovými zařízeními (disky). === Block layer === Bio (block I/O) - základní struktura reprezentující I/O operaci Request queue - fronta čekajících I/O operací I/O Scheduler - optimalizuje pořadí operací pro lepší výkon (CFQ, Deadline, NOOP, BFQ, mq-deadline) Schedulery se snaží: Minimalizovat pohyb hlavičky disku (elevator algoritmy) Předcházet starvation (některé požadavky čekají příliš dlouho) Rozlišit mezi sekvenčním a náhodným přístupem === Generic Block Layer === Poskytuje jednotné rozhraní pro všechna bloková zařízení, podporuje: Merging - spojování sousedících požadavků Plugging - odložení odeslání požadavků za účelem optimalizace Device mapper - virtualizace blokových zařízení (LVM, RAID, šifrování) ==== 7. Vrstva zařízení a ovladačů (Device Drivers) ==== === Typy zařízení === Character devices - proud znaků bez náhodného přístupu (terminály, sériové porty) Block devices - náhodný přístup k datovým blokům (disky, SSD) Network devices - síťová zařízení, nemají speciální soubory v /dev === Ovladače === Ovladače mohou být: Zabudované do jádra (built-in) Moduly - dynamicky načítané soubory ''.ko'' (kernel object) Moduly umožňují: Načítání ovladačů za běhu (''insmod'', ''modprobe'') Odebrání nepoužívaných ovladačů (''rmmod'') Menší velikost jádra Aktualizace ovladačů bez restartu === Subsystémy === USB subsystem - správa USB zařízení, USB core a USB host controller drivers PCI subsystem - správa PCI a PCIe zařízení Input subsystem - klávesnice, myši, touchpady, joysticky Graphics subsystem - DRM (Direct Rendering Manager), framebuffer ==== 8. Síťová vrstva (Network Stack) ==== Linux implementuje kompletní TCP/IP stack s podporou mnoha protokolů. === Vrstvový model === Network Device Drivers - nejnižší vrstva, komunikace s hardware (Ethernet, Wi-Fi) Link layer - LLC, Ethernet framing Network layer - IP (IPv4, IPv6), ICMP, routing Transport layer - TCP, UDP, SCTP Application layer - socket API pro uživatelské aplikace === Socket API === Procesy komunikují přes síť pomocí socketů: SOCK_STREAM - TCP sockety (spojované, spolehlivé) SOCK_DGRAM - UDP sockety (nespojované, nespolehlivé) SOCK_RAW - přímý přístup k IP vrstvě === Netfilter framework === Umožňuje filtrování a manipulaci síťových paketů: iptables/nftables - konfigurace firewallu Connection tracking - sledování stavu spojení NAT - překlad adres (SNAT, DNAT, masquerading) === Networking features === Traffic Control (tc) - QoS, bandwidth shaping Network namespaces - izolace síťových stacků (používá Docker) VLAN, bridging, bonding - virtuální sítě Wireless subsystem (mac80211, cfg80211) ==== 9. Meziprocessová komunikace (IPC) ==== Linux poskytuje několik mechanismů IPC: Pipes a named pipes (FIFO) - jednosměrná komunikace mezi procesy Signals - asynchronní notifikace (SIGKILL, SIGTERM, SIGUSR1...) Message queues - fronty zpráv Shared memory - sdílené paměťové oblasti mezi procesy, nejrychlejší metoda Semaphores - synchronizace přístupu ke sdíleným zdrojům Sockets - síťová i lokální komunikace (Unix domain sockets) ==== 10. Bezpečnost a přístupová práva ==== === Tradiční Unix přístupová práva === Každý soubor má: Owner (vlastník) a Group (skupina) Permissions - read (r), write (w), execute (x) pro owner, group, others Special bits - SUID, SGID, sticky bit === Linux Security Modules (LSM) === Framework umožňující implementaci pokročilých bezpečnostních modelů: SELinux (Security-Enhanced Linux) - mandatory access control, používá Red Hat/Fedora AppArmor - profily omezující přístup aplikací, používá Ubuntu/SUSE Smack - zjednodušený MAC systém TOMOYO - pathname-based MAC === Capabilities === Jemné dělení root oprávnění - místo "vše nebo nic" může proces mít jen některá privilegia: CAP_NET_ADMIN - správa sítě CAP_SYS_TIME - změna systémového času CAP_KILL - posílání signálů jiným procesům CAP_CHOWN - změna vlastnictví souborů === Namespaces === Izolace různých aspektů systému (základ kontejnerů): PID namespace - izolace process IDs Network namespace - vlastní síťový stack Mount namespace - vlastní souborový strom UTS namespace - hostname a domain name IPC namespace - izolace IPC objektů User namespace - mapování UID/GID === Cgroups (Control Groups) === Omezení a měření využití zdrojů skupinou procesů: CPU omezení Paměťové limity I/O bandwidth limity Freezer - pozastavení skupiny procesů ==== 11. Interrupt handling ==== === Hardware interrupty === Když hardware potřebuje pozornost CPU (disk dokončil operaci, přišel síťový paket), vygeneruje interrupt. CPU okamžitě přeruší běžící kód a skočí na interrupt handler (ISR - Interrupt Service Routine). Proces: Hardware vyvolá IRQ (Interrupt Request) CPU uloží kontext a skočí na příslušný handler Handler provede top half - rychlé kritické zpracování Bottom half (softirq, tasklet, workqueue) - odložené nekritické zpracování CPU obnoví kontext a pokračuje === Softirqs a tasklets === Softirq - "měkké" přerušení, zpracování odložené práce s nižší prioritou než hardware interrupt Tasklet - jednodušší forma softirq pro ovladače Workqueue - práce provedená v context procesu (může spát) ==== 12. Synchronizační primitiva ==== Jádro musí chránit sdílená data před souběžným přístupem: Spinlocks - aktivní čekání, drží CPU, používá se pro krátké kritické sekce Semaphores - proces může uspat, používá se pro delší kritické sekce Mutexes - binární semafor, jednodušší API RCU (Read-Copy-Update) - lock-free mechanismus pro čtení dat, writer vytvoří kopii Atomic operations - atomické operace garantované hardware (test-and-set, compare-and-swap) Memory barriers - zajištění pořadí paměťových operací v SMP systémech ==== 13. Architektury CPU ==== Linux kernel podporuje mnoho architektur: x86/x86-64 - Intel a AMD procesory ARM/ARM64 - mobilní zařízení, embedded systémy, servery (Apple M1, AWS Graviton) PowerPC - IBM servery RISC-V - otevřená architektura MIPS, SPARC, s390 - méně běžné Arch-specific kód je v adresáři ''arch/'' ve zdrojácích jádra. ===== Zdroje jádra ===== Celé jádro je napsáno primárně v C (asi 98 %) s částmi v assembleru pro kritické low-level operace. Zdrojový kód obsahuje přes 30 milionů řádků a je organizován do: ''kernel/'' - core funkce (scheduler, signals, timers) ''mm/'' - správa paměti ''fs/'' - souborové systémy a VFS ''net/'' - síťový stack ''drivers/'' - ovladače zařízení (největší část) ''arch/'' - architektura-specifický kód ''include/'' - hlavičkové soubory ===== Uživatelský prostor vs. Kernel space ===== Linux jasně odděluje: User space - neprivilegovaný režim, běžné aplikace, nemohou přímo přistupovat k hardware Kernel space - privilegovaný režim, plný přístup k hardware a paměti Tento model protection rings (na x86 Ring 3 pro user, Ring 0 pro kernel) zajišťuje stabilitu - chybný uživatelský program nemůže shodit celý systém. ===== Závěr ===== Linux kernel je komplexní, vysoce optimalizovaný kus software, který kombinuje monolitickou architekturu s modulárním designem. Jeho úspěch spočívá v open-source modelu vývoje, excelentní podpoře hardware, škálovatelnosti od embedded zařízení po superpočítače a důrazu na výkon a stabilitu. Díky aktivní komunitě tisíců vývojářů po celém světě se jádro neustále vyvíjí a přizpůsobuje novým technologiím.