Co jsou moduly jádra?
Moduly jádra jsou části kódu, které lze na vyžádání načíst a uvolnit z jádra.
Moduly jádra nabízejí snadný způsob, jak rozšířit funkčnost základního jádra, aniž byste museli jádro znovu sestavovat nebo znovu kompilovat. Většina ovladačů je implementována jako moduly linuxového jádra. Když tyto ovladače nejsou potřeba, můžeme uvolnit pouze tento konkrétní ovladač, čímž se zmenší velikost obrazu jádra.
Moduly jádra budou mít příponu .ko. Na normálním linuxovém systému budou moduly jádra umístěny v adresáři /lib/modules/
Dříve jsme diskutovali o tom, jak zkompilovat jádro ze zdrojového kódu.
Tento tutoriál vysvětluje, jak napsat modul jádra pomocí jednoduchého příkladu Hello World.
I. Nástroje pro manipulaci s moduly jádra
1. lsmod – Seznam modulů, které již byly načteny
Příkaz lsmod zobrazí seznam modulů, které jsou již nahrány v jádře, jak je ukázáno níže.
# lsmod Module Size Used by ppp_deflate 12806 0 zlib_deflate 26445 1 ppp_deflate bsd_comp 12785 0 ..
2. insmod – Vložit modul do jádra
Příkaz insmod vloží do jádra nový modul, jak je znázorněno níže.
# insmod /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko # lsmod | grep "squash" squashfs 35834 0
3. modinfo – Zobrazení informací o modulu
příkaz modinfo zobrazí informace o modulu jádra, jak je uvedeno níže.
# modinfo /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko filename: /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko license: GPL author: Phillip Lougher description: squashfs 4.0, a compressed read-only filesystem srcversion: 89B46A0667BD5F2494C4C72 depends: intree: Y vermagic: 3.5.0-19-generic SMP mod_unload modversions 686
4. rmmod – Odebrat modul z jádra
Příkaz rmmod odstraní modul z jádra. Nemůžete odebrat modul, který je již používán jakýmkoli programem.
# rmmod squashfs.ko
5. modprobe – Přidat nebo odebrat moduly z jádra
modprobe je inteligentní příkaz, který načte/uvolní moduly na základě závislosti mezi moduly. Podrobnější příklady naleznete v příkazech modprobe.
II. Napište jednoduchý modul jádra Hello World
1. Instalace linuxových hlaviček
Nejprve musíte nainstalovat linux-headers-.. jak je ukázáno níže. V závislosti na vaší distribuci použijte apt-get nebo yum.
# apt-get install build-essential linux-headers-$(uname -r)
2. Zdrojový kód modulu Hello World
Dále vytvořte následující modul hello.c v programovacím jazyce C.
#include <linux/module.h> // included for all kernel modules #include <linux/kernel.h> // included for KERN_INFO #include <linux/init.h> // included for __init and __exit macros MODULE_LICENSE("GPL"); MODULE_AUTHOR("Lakshmanan"); MODULE_DESCRIPTION("A Simple Hello World module"); static int __init hello_init(void) { printk(KERN_INFO "Hello world!\n"); return 0; // Non-zero return means that the module couldn't be loaded. } static void __exit hello_cleanup(void) { printk(KERN_INFO "Cleaning up module.\n"); } module_init(hello_init); module_exit(hello_cleanup);
Upozornění: Všechny moduly jádra budou pracovat v prostoru jádra, což je vysoce privilegovaný režim. Buďte tedy opatrní s tím, co píšete do modulu jádra.
3. Vytvořte Makefile pro kompilaci modulu jádra
Následující makefile lze použít ke kompilaci výše uvedeného základního modulu jádra hello world.
obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Pomocí příkazu make zkompilujte modul jádra hello world, jak je ukázáno níže.
# make make -C /lib/modules/3.5.0-19-generic/build M=/home/lakshmanan/a modules make[1]: Entering directory `/usr/src/linux-headers-3.5.0-19-generic' CC [M] /home/lakshmanan/a/hello.o Building modules, stage 2. MODPOST 1 modules CC /home/lakshmanan/a/hello.mod.o LD [M] /home/lakshmanan/a/hello.ko make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-19-generic'
Výše uvedené vytvoří soubor hello.ko, což je náš ukázkový modul jádra.
4. Vložte nebo odeberte ukázkový modul jádra
Nyní, když máme náš soubor hello.ko, můžeme tento modul vložit do jádra pomocí příkazu insmod, jak je ukázáno níže.
# insmod hello.ko # dmesg | tail -1 [ 8394.731865] Hello world! # rmmod hello.ko # dmesg | tail -1 [ 8707.989819] Cleaning up module.
Po vložení modulu do jádra bude vyvoláno makro module_init, které zavolá funkci hello_init. Podobně, když je modul odstraněn pomocí rmmod, bude vyvoláno makro module_exit, které zavolá hello_exit. Pomocí příkazu dmesg můžeme vidět výstup z ukázkového modulu jádra.
Pamatujte, že printk je funkce, která je definována v jádře a chová se podobně jako printf v knihovně IO. Pamatujte, že nemůžete použít žádnou z funkcí knihovny z modulu jádra.
Nyní jste se naučili základy vytváření vlastního modulu Linux Kernel.