Jadro systému (Linux)

Ondrej Moriš, xmoris@fi.muni.cz

Obsah

Stručný úvod

Terminologická poznámka: Hoci Linux je pôvodne a správne názvom pre konkrétne jadro operačného systému, často sa spája s operačným systémom ako takým. Aby sme sa vyhnuli terminologickým problémom, v ďalšom texte budeme namiesto Linux používať jadro Linuxu, prípadne jadro.

Jadro Linuxu je používané v tzv. UNIX-like operačných systémoch. Distribuované je pod licenciou GNU GPLv2 a na jeho vývoji sa podiela komunita vývojárov po celom svete. Kód je takmer výhradne písaný v jazyku C až na úseky assembleru, hoci nepriamo sú využité i rôzne skriptovacie jazyky a Fortran či C++. V súčasnosti je toto jadro jedným z najviac portovaných vôbec - od Apple iPod, cez PDA a PC až po väčšinu superpočítačov z Top 500.

Z architektonického hľadiska sa jedná o monolitické jadro s podporou modulov (od verzie 1.2), tj. napr. ovládače zariadení je možné zavádzať do systému za behu v podobe modulov. Zmyslom jadra je veľmi zjednodušene povedané abstrahovať všetok hardvér do podoby istého konzistentného virtuálneho rozhrania. Jadro Linuxu podporuje preemptívny multitasking, virtuálnu pamäť ale napr. i vlákna.

Správcovia dvoch najhlavnejších vývojových stromov sú pôvodný autor Linus Torvalds a Andrew Morton, pričom primárnym zdrojom jadier na internete je "The Linux Kernel Archives" (kernel.org) (ftp,http,rsync). Posledná stabilná verzia 2.6.26.5 je na adrese:

http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.5.tar.bz2

História

Systém verzií

V súčasnosti tvoria verziu jadra Linuxu štyri čísla písané v tvare A.B.C[.D], kde význam jednotlivých čísel je nasledujúci:

Vzhľadom k vysokým minoritným číslam verzií Linus Torvalds nedávno (júl 2008) zvažoval zmeniť systém číslovania na časový - tj. meniť číslo verzie (A) každú dekádu, majoritné číslo (B) každý rok a minoritné (C) s novým vydaním a vždy nenulové. Rozhodnutie mohlo padnúť na tohtoročnom Kernel Summit.

Pretože vývoj jadra funguje formou úprav predchádzajúcich verzií, ktoré sledujú rôzne formy záujmov, je výsledkom sú rôzne stromy verzií jadier. Spájajú sa s nimi mená ich správcov, prípadne verzie jadier dopĺňa prípona. Medzi niekoľko hlavných stromov patrí:

Moduly

Moduly reprezentujú funkcionalitu zavádzanú a odoberanú z jadra podľa potreby bez nutnosti reštartovať systém. Práve moduly odlišujú jadro Linuxu od tradičných monolitických jadier. Minimalizujú pamäť potrebnú pre jadro, čo má význam predovšetkým v embedded systémoch.

Moduly Linuxu a pomocné súbory sú umistnené v adresári /lib/modules/kernel-version, majú príponu .ko (od verzie 2.6), čo je skratka pre "kernel object" (teda modul je prostý objektový kód najčastejšie asi ELF). S príslušnou konfiguráciou (kmod) dokáže jadro moduly zavádzať i bez zásahu užívateľa. Princíp vo verzii 2.6 sa dá veľmi stručne popísať nasledovne (a v prípade užívateľskej práce s modulmi je spôsob takmer rovnaký):

  1. jadro vyžaduje funkcionalitu, ktorá nie je zahrnutá priamo v jadre
  2. démon jadra kmod (v starších verziách kerneld) volá utilitu modprobe(8), s požiadavkom na chýbajúci modul, meno modulu je buď priamo parametrom, alebo ho modprobe zisťuje v súbore /etc/modprobe.conf
  3. modprobe zistí prípadne závislosti spojene s požadovaným modulom prostredníctvom súboru modules.dep
  4. modprobe napokon volá insmod(8) pre všetky potrebné moduly
  5. insmod vyvolá v user-space init_module, ktorý prakticky len skopíruje binárny kód modulu do kernel-space, čím je prakticky funkcionalita modulu dostupná jadru
Pre záujemcov možno ďalej doporučiť snáď len nahliadnutie do relevantných zdrojových súborov: linux/kernel/kmod.c, linux/include/linux/module.h a linux/include/linux/module.c.

Konfigurácia

Konfigurácia jadra je netriviálna úloha, ktorá vyžaduje jednak znalosti o hardvéri obecne a druhak o hardvéri daného počítača. Zistiť informácie o hardvéri počítača, na ktorom práve pracujeme, umožnuje hneď niekoľko systémových utilít: lspci(8), lsscsi(8), lsusb(8), lshal(1) či dmidecode(8). Informacie o CPU a pamäti je možné zistiť i pomocou súborov /proc/cpuinfo a /proc/meminfo. V prípade vyššie zmieňovaných utilít je často problém orientovať sa v ich výstupoch, veľmi zaujimavá sa v porovnaní s nimi preto javí utilita lshw (vid http://sourceforge.net/project/showfiles.php?group_id=32683). Jej výstup je pomerne ľahko zrozumiteľný a môže vyzerať napr. nasledovne:

     *-memory
          description: System Memory
          physical id: 2b
          slot: System board or motherboard
          size: 1280MB
        *-bank:0
             description: SODIMM DDR Synchronous
             physical id: 0
             slot: DIMM 1
             size: 256MB
             width: 64 bits
        *-bank:1
             description: SODIMM DDR Synchronous
             physical id: 1
             slot: DIMM 2
             size: 1GB
             width: 64 bits
  
Dokonca i so znalosťou hardvéru daného počítača, stále zostáva otázka, ako určiť tie správne ovládače resp. konfiguračné voľby jadra? Bohužial neexistuje univerzálna odpoveď ... východiskom môže byť napr. projekt "LKDDb (Linux Kernel Driver DataBase)" (vid http://cateee.net/lkddb/). Ide o databázu rôzneho hardvéru spolu s príslušnými konfiguračnými voľbami a ovládačmi, napr.:
lkddb   acpi    "IBM0068"       :: CONFIG_THINKPAD_ACPI :: drivers/misc/thinkpad_acpi.c
  
V spojení s "AutoKernConf" (vid http://cateee.net/autokernconf/) je tak možné v určitej miere automatizovať správnu konfiguráciu jadra. Princpíp je jednoduchý - skript pomocou systémových utilít a súborového systému /sys (ide nám jadrá verzie 2.6) zistí hardvér počítača a pomocou databázy nastaví správne voľby.

Vo verzii 2.6 jadra Linuxu existuje niekoľko konfiguračných utilít, medzi najdôležitejšie patria: Konfiguračnú utilitu spustíme programom make, napr. make xconfig. Výstupom konfigurácie je súbor .config. Nasleduje veľmi stručný prehľad hlavných konfiguračných volieb vo verzii jadra 2.6:

Preklad a nasadenie

Preklad a nasadenie jadra pozostáva z niekoľkých krokov:

  1. získať a prípadne dekomprimovať jadro, pre zvyšné kroky je ideálne nastaviť pracovný adresár na adresár jadra
  2. priradiť jadru unikátne meno prostredníctvom EXTRAVERSION v hlavnom súbore Makefile, neprídeme tak o súčasnú verziu modulov
  3. zálohovať súbor .config
  4. vyčistiť jadro (tj. uviesť jadro do pôvodného stavu) pomocou make mrproper
  5. konfigurovať jadro
  6. (vo verzii 2.4 je nutné generovanie závislostí a potrebných hlavičkových súborov pomocou príkazu make dep)
  7. odstrániť rôzne objektové súbory pomocou príkazu make clean
  8. zostaviť samotné jadro prípazok make bzImage, zostavené jadro sa v prípade hladkého priebehu nachádza v adresári kernel-sources/arch/$ARCH/boot
  9. v prípade povolenia modulov v konfigurácii jadra je potrebné tieto moduly zostaviť prípazom make modules a následne ich nainštalovať príkazom v privilegovanom režime make modules_install, moduly sa skopírujú do adresára /lib/modules/$VERSION.$PATCHLEVEL.$SUBLEVEL-$EXTRAVERSION
  10. skopírovať zostavené jadro bzImage a súbor System.map do adresára /boot
  11. upraviť konfiguráciu používaného zavádzača
Pri ladení jadra hrá dôležitú úlohu súbor System.map. Obsahuje totiž adresy a mená symbolov preloženého jadra a používa ho utilita ksymoops pri preklade tzv. "kernel oops" (odchýlky od korektného chovania linuxu) do zrozumiteľnejšej podoby. Je zaujímavé, že napr. vo verzii 2.5 nebol tento súbor vobec potrebný, pretože funkcionalita utility ksymoops bola implementovaná priamo v jadre. Tradičné umiestnenie súboru je v /boot alebo /usr/src/linux.

Jadro Linuxu dokáže v momente štartu prijať niekoľko iniciálnych parametrov, typicky za účelom odstraňovania chýb systému, nastavenia hadrvérových parametrov, ktoré jadro nie je schopne samo zistiť, zvyšovania výkonu a pod. Pri zavádzaní z BIOSu však nie je možné tieto parametre nastaviť, je nevyhnutné využiť nejaký zavádzač (lilo, grub, loadlin, atd.). Syntax parametrov je tvaru:

názov[=hodnota_1][,hodnota_2]...[,hodnota_10]


Počet hodnôt pre každý parameter je limitovaný číslom 10, možno však použiť parameter i niekoľkokrát. Význam rôznych parametrov je zdokumentovaný manuálovou stránkou bootparam(7). Najpoužívanejšie parametre sú napr.:

Referencie