Jádro

Lukáš Vrbecký, asterisk@mail.muni.cz


Obsah


Historie jádra

Autorem jádra operačního systému Linux je fin Linux Torvalds. Jako student Helsinské university měl možnost setkat se systémem Unix. Ten ho oslovil a proto si na svůj domací počítač nainstaloval Minix (jednalo se o ořezanou distribuci Unixu). Brzy ale zjistil, že to, co má, není přesně to, co by chtěl a tak začal programovat svůj vlastní "opravdový" operační systém a i když to původně neplánoval z jeho projektu, kde testoval vlastnosti proceroru 386, vznikl Linux.

Původní kód, který Linux napsal měl ale jeden problém - systém podporoval hlavně hardware, který měl Linus k dispozici. Proto se postupně k jeho projektu přidávalo stále více nadšených programatorů. První verze pochazí z roku 1994, nese označení 1.0 a první spolehlivější verze vznikla v roce 1995 a nesla označení 1.2, ale stále nebyla stabilní pro procesory Alpha. O rok později vznikla verze 2.0, která tento problém vyřešila. Tato verze také podporovala víceprocesorové systémy a dala se označit za samostatný operační systém, proto nesla označení 2.0.

Jádro systému linux vzniklo na základe vlastností systému unix. I když jsou implementace rozdílné, dají se programy mezi těmito systémy přenášet na urovni zdrojových kodů - tzn. kód pro linux jde přeložit i pod unixem. Linux zahrnuje oba standardy BSD i Systém V, i když samotné jádro bylo implementováno zcela nezávisle.


Popis jádra

Jádro používané v systému Linux může být monolitické, tzn. že tvoří jeden velký programový celek, z venku pusobí jako jeden program, který je třeba zkompilovat najednou a proto je vhodné zkompilovat si jádro přímo na míru. Toho dosáhneme tím, že v nastavení kompilace vyřadíme nepotřebné časti kódu. Sníží se tím i spotřeba paměti, ale zase je nutné jádro při změně hardware nebo po změně konfigurace překompilovat. Proto se v dnešním jádře využívá tzv. modulů. Jsou to bloky kódu, které se můžou dynamicky přilinkovat k jádru až v okamžiku, kdy jsou potřeba a nebo zase odlinkovat, když jsou již zbytečné. Správa modulů stojí určitý režijní čas avšak v porovnání s tím, co nám nabízí je tato doba zanedbatelná. Moduly se dají samostatně kompilovat a tím pádem se na nich i snáze ladí chyby. Po připojení k jádru se stávají jeho regulérní součastí a mají stejné pravomoce jako jiný kód jádra. Z tohoto pohledu znamená používání modulů jisté bezpečnostní riziko. Pokud má být jádro zkompilováno optimálně, nekompilujete ovladače, které nepotřebujeme ani jako moduly! Moduly, které se mají automaticky zavést po startu systému se uvadí do /etc/modules.conf. Pro ty, které potřebujete zavést až za běhu systému, máte příkaz insmod (načte modul do jádra), rmmod (odebere modul z jádra), lsmod (vypíše používané moduly).

Jádro má v systému spoustu důležitých úloh. Je to jakýsi prostředník mezi hardware a aplikacemi bežícími na daném systému. Stará se o plánování využití procesoru, kontroluje i/o zařízení, spravuje pamět a poskytuje prostředky pro komunikaci mezi procesy nebo synchronizaci procesů. Během bootovaní připojuje kořenový svazek a předává řízení procesu init. Stará se o multitasking při víceuživatelských systémech, a spravuje komunikaci na síti. Samotné jádro po většinu času zůstavá skryto v pozadí a není přímo sledovatelné, i když se jedná o nedůležitější část systému. Jádro skrývá hardware před software a využívá k tomu i podporu procesoru - dva režimy přistupu.


Kde lze jádro stáhnout a jaké je číslovaní

Aktualní verze jádra se dají stahnout na www.kernel.org. Tato stránka je pod vedením samotného Linuse. Jeho verze jádra je označována jako Vanilla a v současné době je k dispozici jadro verze 2.6.11. Sbalené zdrojové kódy mají asi 44MB a na serveru jsou uloženy jako linux-2.6.11.tar.gz.

Číslovaní jádra má určitá daná pravidla. Verzi obvykle označují 3 čísla oddělena tečkou: x.y.z

Mimo toto označení existuje také označení pro testovací verze, které předchází nějaké stabilní verzi. Používají přípony -test1. potom -pre a nakonec -RC. (release candidate)

Některé distribuce používají vlastní jádra zabalené do baličků. Tyto lze také použít, ale distributoři si často upravují svoje jádra a způsobují v nich nemalé změny. To má za následek, že není možné aplikovat tzv. patche, které jsou také dostupné na stránce www.kernel.org. Protože zdrojové kódy jádra dosáhly obrovských rozměrů, někdy je lepší místo celého archívu stáhnout pouze patch. Ten udává rozdíl mezi poslední verzí a verzí předtím. Je to jakýsi schůdek od verze k verzi. Na jádro verze Vanilla by neměl být problém aplikovat vetšinu patchů. Pokud jich máme více, je nutné je aplikovat postupně všechny.

Aktuální verze jádra se dá zjistit také příkazem "finger @kernel.org".Tady ale server přímo žádá své uživatele, aby tuto službu nevyužívali k nějakému automatickému kontrolovaní, neboť server je tímto značně zatěžován. Ze stejného důvodu lze také jádro stáhnout z mirrorů. Pro nás je nejblížší třeba CVUT nebo ftp.linux.cz


Proč kompilovat jádro?

Pro kompilaci jádra je hned několik důvodů.

Stejně tak je několik důvodů, proč jádro nekompilovat. Rozhodně to není první věc, kterou by jste měli zkoušet jako začátečníci. Konfigurace si vyžaduje spoustu nastavení, která mohou být matoucí a ve výsledku může takový update spíše uškodit. Dalším důvodem je, že některé distribuce mají jádro natolik vylazené a upravené, že se prostě změna nevyplatí. A jako poslední musíme vzít v úvahu, že pokud něco bezchybně funguje, není třeba to měnit.

Zdrojový systém na kterém ma konfigurace probíhat musí mít minimálně gcc pro kompilaci a také stažené a rozbalené zdrojové kody nového jádra. Ty se obvykle nechazí v adresaři "/usr/src/". Je třeba taky mít na paměti, že kód po rozbalení zabíra bezmala 200MB, tedy je také nutné mít toto místo k dispozici.


Konfigurace kompilace

Pokud je všechno připraveno, můžeme se pustit do konfigurace kompilace jádra. To je proces, kdy si vybereme, které časti se mají do jádra přeložit, vynechat nebo zahrnout jako moduly. Na konfiguraci jádra slouží několik promocných programů. Všechny se spouští z adresáře /usr/src/linux. (pozn. toto je v podstatě odkaz na adresář aktuálního jádra, proto je dobré dávat pozor, co vlastně kompilujeme.


Důležité volby konfigurace a jejich význam

Při konfiguraci kompilace nového jádra je třeba věnovat zvlaštní pozornost některým položkám nastavení. Následně totiž muze vzniknout problém, když zapomenete zakompilovat podporu něčeho zásadního jako je třeba ext3. Dalším problémem je, že všechno děláte jako root.

Jak jsem již zmínil, jádro může být monoliticke nebo modulární. Pokud chcete, aby vaše jádro podporovalo moduly, je třeba zaškrtnout položku "Loadable module support --> Enable loadable module support". Jinak žádný modul do jádra nenahrajete. Další důležitá volba je výběr podporovaných souborových systému. Už jsem naznačil, že je potřebné, aby jádro podporovalo minimalné ten systém, na kterém je umístěn kořenový adresář. Mimo to je ale vhodné zahrnout i podporu dalších, které budeme používat. Volba je v menu File systems.

U verzí jádra jsem zmínil patche. Pokud jsme nějáka do zdrojového kódu aplikovali, je třeba je přídat v nastavení. Když je nepřidáte, systém bude zkompilován bez nich.

V sekci "Procesor type and features" je možné přesně nastavit procesor, pro který je jádro kompilováno. Tady stoji za zmínku položka "High memory support", kterou musíte zaškrtnout v připadě, že váš systém má více jak 960MB paměti.

Z dalších voleb bychom snad měli jen připomenout networking, který je vhodné zapnout i v případě, že sít nemáte, ale uvažujete o instalaci VMware, podporu filesystemu, které používají CD - ISO9660 a Kernel hacking - volba se doporučuje vypnout, platná pouze pro vývojáře. Někdy může nastat problém při optimalizaci kódu pro daný procesor. Potom použijte obecnější zadání. Konfigurace se ukladá do souboru .config.


Kompilace a instalace nového jádra

Samotná kompilace je pak již velmi jednoduchá. Pokud jste se již o nejaké kompilace pokoušelí, můžete odstanit předchozí soubory příkazem "make clean", maže hlavne binarní soubory, a nebo "make mrproper", který smaže soubory tak, aby zůstaly jako v původní distribuci.

Nakonec kompilace:
make dep - kontrola závislostí konfigurace (popřípadě i clean na pročistění)
make bzImage - vytvoření obrazu jádra. Dříve bylo "make zImage", bzImage = big zImage
make modules - přeložení modulu
make modules_install - instalace modulu

Můžeme také vytvořít bootovací disketu příkazem "make bzDisk"

Po kompilaci je jádro uloženo v adresáři /usr/src/linux/arch/i386/boot/bzImage a moduly se nahrají do /lib/modules/$verze , kde $verze je verze jádra. Na závěr je potřeba přehrát bzImage do boot oblasti a nakonfigurovat zavadeč (lilo/grub), aby systém bootoval i s tímto jádrem. Vždy je dobré mít možnost nabootovat ze starého jádra, pro případ nouze. Zavaděč lilo se konfiguruje pomocí souboru /etc/lilo.conf.


System.map

Soubor "/boot/System.map" je symbolickým linkem na "/boot/System.map-verze", kde verze udává některé z nainstalovaných jader. Je to v podstatě seznam všech funkcí obsažených v jádře. Jádro zná své funkce ve svém formátu, který je pro nás špatně čitelný (hodnoty typu c01ba910, c01bcb00 atp.) System.map funguje jako převodní tabulka čitelnější podoby. Formát souboru je následující:

c01058a0 t inflate_codes

Tento soubor se při bootovaní zpracovává a ukládá jako "/proc/ksyms". Tento soubor se liší v zavislosti na použitých modulech, které jsou načteny a používá ho většina programů. System.map potom používají spíše systémové programy jako je ps, uptime nebo top a také logovací deamon klogd. Ten vypisuje informace o chybě do externího souboru a na zpracování tohoto výpisu do srozumitelné podoby používá právě zmíněný System.map. Protože tento soubor se ale liší od instalace k instalaci, je-li špatně nastaven, informace od klogd jsou zapsaný chybně. Po kompilaci jádra je proto dobré zkopírovat System.map do umístění, kde jej klogd najde. To jsou například "/boot/System.map", "/System.map" nebo "/usr/src/linux/System.map". Další možnosti je vytvořit symbolický odkaz.


Shrnutí a odkazy

Pokud se do kompilace jádra pustíte, na internetu je spousta odkazu, které tuto problematiku docela dobře dokumentují. Já sám jsem čerpal také z referátů předchozích ročníku. Jsou si ve směs hodně podobné, ale najdou se mezi nimi i kvalitní kousky, které můžou nabídnout i podrobnější popisy přímo kompilace nebo jejich voleb.
Některé další odkazy jsou:

Kompilace jádra

Kompilační parametry jádra Linux

Compiling the Linux Kernel

Linux kernel HOWTO