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.
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.
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ů.
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).
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)
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.
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
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
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 - 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
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čí.
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)
Cachuje nedávno používané dentry objekty v paměti, výrazně zrychluje operace s cestami (path lookup).
Cachuje inode struktury, aby se nemusel při každém přístupu číst disk.
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
Tato vrstva zprostředkovává komunikaci mezi souborovými systémy a blokovými zařízeními (disky).
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
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í)
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 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
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
Linux implementuje kompletní TCP/IP stack s podporou mnoha protokolů.
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
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ě
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)
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)
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)
Každý soubor má:
Owner (vlastník) a Group (skupina) Permissions - read ®, write (w), execute (x) pro owner, group, others Special bits - SUID, SGID, sticky bit
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
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ů
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
Omezení a měření využití zdrojů skupinou procesů:
CPU omezení Paměťové limity I/O bandwidth limity Freezer - pozastavení skupiny procesů
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
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)
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
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.
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
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.
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.