Was sind Kernelmodule?
Kernel-Module sind Codestücke, die bei Bedarf vom Kernel geladen und entladen werden können.
Kernelmodule bieten eine einfache Möglichkeit, die Funktionalität des Basiskernels zu erweitern, ohne den Kernel neu erstellen oder neu kompilieren zu müssen. Die meisten Treiber sind als Linux-Kernel-Module implementiert. Wenn diese Treiber nicht benötigt werden, können wir nur diesen spezifischen Treiber entladen, wodurch die Kernel-Image-Größe reduziert wird.
Die Kernel-Module haben die Erweiterung .ko. Auf einem normalen Linux-System befinden sich die Kernel-Module im Verzeichnis /lib/modules/
Zuvor haben wir besprochen, wie man einen Kernel aus der Quelle kompiliert.
Dieses Tutorial erklärt anhand eines einfachen Hello World-Beispiels, wie man ein Kernel-Modul schreibt.
Ich. Dienstprogramme zum Manipulieren von Kernelmodulen
1. lsmod – Bereits geladene Module auflisten
Der Befehl lsmod listet Module auf, die bereits im Kernel geladen sind, wie unten gezeigt.
# lsmod Module Size Used by ppp_deflate 12806 0 zlib_deflate 26445 1 ppp_deflate bsd_comp 12785 0 ..
2. insmod – Modul in Kernel einfügen
Der Befehl insmod fügt ein neues Modul in den Kernel ein, wie unten gezeigt.
# insmod /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko # lsmod | grep "squash" squashfs 35834 0
3. modinfo – Modulinfo anzeigen
Der Befehl modinfo zeigt Informationen über ein Kernelmodul wie unten gezeigt an.
# 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 – Modul aus Kernel entfernen
Der Befehl rmmod entfernt ein Modul aus dem Kernel. Sie können kein Modul entfernen, das bereits von einem Programm verwendet wird.
# rmmod squashfs.ko
5. modprobe – Module zum Kernel hinzufügen oder entfernen
modprobe ist ein intelligenter Befehl, der Module basierend auf der Abhängigkeit zwischen Modulen lädt/entlädt. Ausführlichere Beispiele finden Sie unter modprobe-Befehle.
II. Schreiben Sie ein einfaches „Hello World“-Kernelmodul
1. Installieren der Linux-Header
Sie müssen zuerst die linux-headers-.. wie unten gezeigt installieren. Verwenden Sie je nach Distribution apt-get oder yum.
# apt-get install build-essential linux-headers-$(uname -r)
2. Quellcode des Hello World-Moduls
Erstellen Sie als Nächstes das folgende hello.c-Modul in der Programmiersprache 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);
Warnung: Alle Kernel-Module arbeiten im Kernel-Space, einem hochprivilegierten Modus. Seien Sie also vorsichtig mit dem, was Sie in ein Kernel-Modul schreiben.
3. Makefile zum Kompilieren des Kernel-Moduls erstellen
Das folgende Makefile kann verwendet werden, um das obige grundlegende Kernel-Modul „Hello World“ zu kompilieren.
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
Verwenden Sie den Befehl make, um das Kernelmodul hell world zu kompilieren, wie unten gezeigt.
# 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'
Das Obige erstellt eine hello.ko-Datei, die unser Beispiel-Kernel-Modul ist.
4. Fügen Sie das Kernel-Beispielmodul ein oder entfernen Sie es
Jetzt, da wir unsere hello.ko-Datei haben, können wir dieses Modul in den Kernel einfügen, indem wir den insmod-Befehl wie unten gezeigt verwenden.
# insmod hello.ko # dmesg | tail -1 [ 8394.731865] Hello world! # rmmod hello.ko # dmesg | tail -1 [ 8707.989819] Cleaning up module.
Wenn ein Modul in den Kernel eingefügt wird, wird das Makro module_init aufgerufen, das die Funktion hello_init aufruft. Wenn das Modul mit rmmod entfernt wird, wird in ähnlicher Weise das Makro module_exit aufgerufen, das hello_exit aufruft. Mit dem Befehl dmesg können wir die Ausgabe des Kernel-Beispielmoduls sehen.
Bitte beachten Sie, dass printk eine im Kernel definierte Funktion ist und sich ähnlich wie printf in der IO-Bibliothek verhält. Denken Sie daran, dass Sie keine der Bibliotheksfunktionen des Kernelmoduls verwenden können.
Jetzt haben Sie die Grundlagen gelernt, um Ihr eigenes Linux-Kernel-Modul zu erstellen.