Zavádění ovladačů
V systému Linux je ovladač buď je přímo zakompilován do jádra jako jeho nedílná součást jádra nebo je zkompilován jako samostatný soubor nazývaný modul jádraPro účely tohoto textu budou pojmy modul jádra a ovladač zařízení zaměnitelné. Ve skutečnosti ovšem může jeden modul obsahovat kód více ovladačů nebo může do jádra přidávat kód, který s řízením zařízení vůbec nesouvisí - např. modul souborového systému. (kernel module).
Moduly jádra jsou speciálním typem objektových souborů s příponou *.ko (kernel object), které mohou být za běhu systému zaváděny a vyjímány do/z jádra. Po zavedení do jádra se stávají jeho součástí a mají k prostředkům jádra plný přístup, stejně jako kdyby do něj byly zakompilovány.
Hlavní výhodou modulů jádra je, že mohou být zavedeny jen když je ovládané zařízení skutečně v počítači přítomné (např. USB flash disk). Jádro tak může být udržováno malé, přičemž jeho funkcionalita může být za běhu systému snadno rozšiřována pomocí modulů jádra.
Při zavádění modulů do jádra musíme mít na paměti, že modul jádra může být úspěšně zaveden pouze do jádra, které má stejnou verzi a které je určeno pro stejnou platformu, jako bylo jádro v jehož kontextu (rozuměj vůči kterému) byl modul jádra sestaven. Pro tento účel je součástí modulu jádra soubor vermagic.o, který obsahuje právě informaci o verzi jádra a platformě, pro kterou je modul určen.
Utility pro zavádění
K zavádění a vyjímání modulů jádra se využívá několika utilit, které si krátce představíme. Všechny tyto utility je nutné volat s právy superuživatele (uživatel root).
V distribucích Linuxu jsou utility pro práci s moduly jádra dostupné v podobě instalačního balíčku. Jeho název se liší podle distribuce, např. pro distribuci Debian 6.0 Sueeze je to balíček module-init-tools.
Utilita insmod umí zavést modul uvedený jako její parametr do jádra případně s i parametry modulu. Jestliže se modul nenachází v aktuálním adresáři (odkud byla volána utilita insmod), je třeba v názvu modulu uvést plnou cestu. Název modulu se uvádí vždy s příponou *.ko. V případě, že zaváděný modul závisí na jiných modulech, musíme tyto moduly zavést předtím ručně, jinak by zavádění modulu selhalo. Utilita insmod totiž neumí automaticky vyřešit závislosti mezi moduly.
Příkaz:
# insmod /lib/modules/2.6.32-5-686/kernel/drivers/acpi/button.ko
zavede modul button, který se nachází adresáři /lib/modules/2.6.32-5-686/kernel, kde jsou standardně umístěny moduly jádra (jádro na mém systému Linux je verze 2.6.32, platforma 686).
Příkaz s parametry:
# insmod /lib/modules/2.6.32-5-686/kernel/drivers/acpi/button.ko parameter=hodnota
Vyjme uvedený modul z jádra. V tomto případě stačí uvést pouze jméno modulu bez přípony a případně i bez plné cesty. Stejně jako utilita insmod ani rmmod nerespektuje závislosti mezi moduly, takže moduly na kterých vyjmutý modul závisí, musíme vyjmout z jádra ručně.
Příkaz:
# rmmod button
vyjme modul button z jádra.
Utilita lsmod vypíše seznam modulů, které jsou úspěšně zavedené v jádře (vytvoří formátovaný výstup z obsahu souboru /proc/modules). Můžeme si tak ověřit, že modul byl úspěšně zaveden nebo naopak vyjmut z jádra. Utilita ke svému spuštění nevyžaduje práva superuživatele (root).
Příkaz:
# lsmod
Na obrázku 1.2 je zkrácený výstup utility lsmod.
Podobně jako utilita insmod umí utilita modprobe zavést modul do jádra. Je však mnohem chytřejší. Jednak jí stačí zadat pouze jméno modulu, protože se jej sama pokusí najít v adresáři /lib/modules/verzejadra-platforma/kernelMísto řetězce verzejadra-platforma se dává příkaz ‘uname -r‘, který se na mém systému rozvine v text 2.6.32-5-686, což je právě verze jádra a typ platformy. a jeho podadresářích, kde jsou standardně umístěny moduly jádra. Navíc automaticky zavede i všechny moduly, na kterých uvedený modul závisí. Jedinou podmínkou je, aby v adresáři /lib/modules/verzejadra-platforma byl přítomný soubor modules.depSoubor modules.dep se aktualizuje příkazem depmod -a, který popisuje závislosti mezi moduly, a aby závislosti zaváděného modulu byly v tomto souboru uvedeny.
Samozřejmě je možné uvést za názvem modulu i jeho parametry.
Příkaz:
# modprobe button
zavede modul button a případně i všechny moduly, na kterých závisí.
Modprobe s volbou -r vyjme uvedený modul z jádra včetně modulů, na kterých modul závisí, pokud ovšem tyto nejsou používány i jinými moduly.
Příkaz:
# modprobe -r button
vyjme z jádra modul button a případně všechny nepoužívané moduly, na kterých závisí.
Pomocí utility modinfo můžeme zjistit základní informace o modulu jádra - jeho přesné umístění v rámci adresáře /lib/modules/verzejadra-platforma/kernel, licence pod kterou je modul distribuován, popis modulu, autora, závislosti na ostatních modulech a verzi jádra a typ platformy, pro kterou je modul určen. Podobně jako utilita modprobe nevyžaduje plnou cestu k modulu, protože jej hledá v adresáři /lib/modules/verzejadra-platforma/kernel.
Příkaz:
# modinfo button
vypíše informace o modulu button - viz obrázek 1.3.