Jádro systému
František Kobzík, kobza@mail.muni.cz
Obsah
Co je jádro
Linux spatřil světlo světa v roce 1991, kdy jej začal psát Linus Torvalds a své
počínání oznámil na usenetové skupině comp.os.minix. Původně byl Linux určen
pro procesory 386/486, posléze se počet podporovaných procesorů a architektur
zvyšoval.
Logicky se jádro nachází mezi HW a uživatelským prostorem.
Má za úkol plánování CPU, správu paměti, správu procesů, fs, sítě. Z hlediska
architektury se jedná o "téměř" monolitické jádro (možno přizpůsobovat za běhu
pomocí modulů).
Historie
- 1991: Linuxové jádro je veřejně ohlášeno jednadvacetiletým finským studentem Linusem Torvaldsem.
- 1992: Licence jádra změněna na GNU GPL. Objevují se první linuxové distribuce.
- 1993: Na Linuxu pracuje přes 100 vývojářů. Vychází Slackware a Debian.
- 1994: Vychází verze 1.0. Umožňuje používání XFree86. RedHat a SUSE vydávají své vlastní distribuce Linuxu.
- 1996: Vychází verze 2.0.x. Přináší podporu více procesorů.
- 1998: Velké společnosti (IBM, Compaq, Oracle) oznamují podporu Linuxu.
- 1999: Vychází verze 2.2.x.
- 2001: Vychází verze 2.4.x.
- 2003: Vychází verze 2.6.x.
Jádro je tvořeno velkým číslem vývojářů po celém světě.
Možno stáhnout na http://kernel.org (aktuální verze, staré verze, repozitáře...).
Číslování verzí
- Původně: 0.01, 0.02 etc.
- Posléze (mezi verzemi 1.0 a 2.6) 3 čísla: A.B.C
- A - verze jádra
- B - řada (liché číslo značí vývojovou řadu, sudé značí stabilní řadu)
- U verze 2.6 se přešlo na 4 číslice A.B.C.D
- A, B jsou od té doby irelevantní (konstantní v čase :) )
- C - verze jádra
- D - opravy chyb a bezpečnostních děr pro C
Dále může být jádro označeno suffixem, jako např. -mm, -ac a podobně. Typicky
se jedná o jádra vydávané vývojářem kernelu (mm - Andrew Morton, ac - Alan Cox).
Způsoby konfigurace
Po stažení archivu s jádrem a jeho rozbalení (tar -xjf) je možno jej
konfigurovat pomocí make. Konfigurací jádra nastavíme, které části do
něj chceme napevno zakompilovat, které chceme použít jako moduly a které vůbec
nepoužívat.
Konfigurace:
Příkaz make +
- config: interaktivní konfigurace (nepohodlné)
- menuconfig: ncurses menu
- xconfig/gconfig: GUI konfigurace (Qt/GTK)
- oldconfig: využívá se při portování konfiguračního souboru (.config) z
předchozích kompilací (symboly se ale mohou změnit)
Sestavení:
- make bez dalšího parametru: zkompiluje jádro a moduly
Dále make +
- bzImage: zkompiluje jádro a jeho obraz uloží do souboru (arch/"jmeno_architektury"/boot/bzImage)
- modules: zkompiluje moduly
- modules_install: zkopíruje moduly do /lib/modules/"verze_jadra"
- install: instaluje jádro
Při konfiguraci postupujeme tak, abychom do jádra nepřidávali ovladače
zařízení, která nikdy nepoužijeme. Ovladače zařízení, která používáme občas
nastavíme jako moduly (WiFi karty, Bluetooth). Nezbytné součásti zakompilujeme
napevno (ovladače disku, grafické karty, systém souborů na disku...).
Pro snadnější orientaci v HW PC je k dispozici sada následujících příkazů:
- lspci - výpis informací o PCI sběrnicích a zařízeních připojených v nich
- lsmod - vypíše aktuálně používané moduly
- lsusb - podobně jako lspci
- cat /proc/cpuinfo - vypíše informace o procesorech
- dmesg - vypíše zprávy jádra od bootu
Zajímavé konfigurační volby
- General Setup
- Support for paging of anonymous memory - podpora swapu
- System V IPC - meziprocesorová komunikace (zprávy, semafory, sdílená paměť)
- Kernel .config support
- Initial RAM fs and RAM disk - podpora ramdisku při startu jádra
- Loadable module support - podpora zavádění LKM
- Processor type and features - nastavení podpory a funkcí procesoru
- Tickless system - beztikový systém
- Processor family - rodina procesoru - vhodné nastavit přesně pro využití specifických instrukcí a flagů pro kompilátor
- High Memory Support - podpora více než 4GB paměti na 32bitovém procesoru
- Power management and ACPI options - nastavení věcí souvisejících s napájením
- Power management support
- Hibernation
- Suspend to RAM
- ACPI
- CPU frequency scaling
- Bus options - podpora sběrnic (PCI, AGP, PCMCIA) a jejich funkcí
- Executable file formats - podpora spustitelných formátů (ELF, a.out)
- Networking support - nastavení protokolů a voleb souvisejících s komunikací
stroje
- Networking options - podpora protokolů TCP/IP, ATM, IPX, filtrování packetů, QoS
- Další volby - podpora bezdrátových sítí, WiMAX, IrDA, Bluetooth
- Device drivers
- ovladače pro zařízení
- obsahuje podstrom kategorií ovladačů zařízení a sběrnic (Graphics Drivers,
Sound, Network devices, USB, SCSI, ATA, SATA, FireWire, I2C)
- File systems - podpora souborových systémů (ext2-4, reiserfs, FAT, UDF,
FUSE, tmpfs)
- Kernel hacking - zapíná vlastnosti jádra vhodné pro vývojáře (debugging)
- Virtualization - HW virtualizace - k tomu je potřeba procesor, který ji
podporuje
Principy fungování modulů
Samostatné binární soubory rozšiřující funkcionalitu jádra. Nejsou
zakompilované v jádře a je možno nahrát je za běhu systému (vhodné například
pro ovladače, které nepoužíváme často - bezdrátové síťové karty). Jakmile je
modul nahrán, běží v kernel space. Modul je možno nahrát buď ručně (příkaz
insmod nebo modprobe), nebo automaticky v případě potřeby
(démon kmod). Pro odstranění modulu slouží příkaz rmmod.
Příkaz modprobe je sofistikovanější než insmod - před
nahráním samotného modulu nahraje moduly potřebné pro splnění závislostí (viz.
soubor /lib/modules/"verze_jadra"/modules.dep).
Moduly se nachází v adresáři /lib/modules/"verze_jadra"/.
Instalace nového jádra
Po stažení, konfiguraci a kompilaci jádra a modulů (příkazem make) jádro
"nainstalujeme" do adresáře /boot (make install) a
nainstalujeme moduly (make modules_install). Nakonec uvědomíme zavaděč (GRUB,
lilo,...) o existenci nového jádra přidáním záznamu do jeho konfiguračního
souboru.
initrd - initial ramdisk
Obraz fs s moduly. Umožní nahrát potřebné
moduly pro zařízení v době bootu (fs, ovladač disku...). To je výhodné
například v situaci, kdy k danému zařízení máme například pouze zkompilovaný
modul od výrobce a toto zařízení potřebujeme při startu jádra. Dále initrd
usnadňuje život vývojářům distribucí (distribuční jádra).
Soubor System.map
Tento soubor obsahuje tabulku symbolů a korespondujících adres. To se hodí
například při debugování při převodu adres na jména volání. Soubor je typicky
uložen v /boot/System.map-"verze_jadra" a je generován po každé
kompilaci jádra.
Parametry jádra při startu
Při bootu přijímá linuxové jádro určité parametry. Ty se mohou hodit při řešení
problémů se systémem, ladění atp.
Parametry se zadávají ve formátu jméno=hodnota1,hodnota2,...
Mezi nejdůležitější parametry patří:
- init=cesta_k_souboru - nastaví příkaz spouštěný jádrem (implicitně /sbin/init)
- single - nastaví jednouživatelský režim
- root=/dev/hda1 - řekne jádru, který oddíl připojit jako /
- ro, rw - připojení / read-only, read-write
- panic=X - v případě fatální chyby rebootuje za X sekund
- debug - debugovací režim
- selinux [0|1] - vypne|zapne SELinux při startu
- initrd - cesta k initial ramdisku
Vyčerpávající popis parametrů lze najít v manuálové stránce bootparam(7).
Literatura