linux-kernel
Treiber für Linux Hello World Device
Suche…
Ein leeres Kernelmodul
#include <linux/init.h>
#include <linux/module.h>
/**
* This function is called when the module is first loaded.
*/
static int __init hello_kernel_init(void)
{
printk("Hello, World!\n");
return 0;
}
/**
* This function is called when is called if and when the module is unloaded.
*/
static void __exit hello_kernel_exit(void)
{
printk("Goodbye, cruel world...\n");
}
/* The names of the init/exit functions are arbitrary, and they are bound using the following macro definitions */
module_init(hello_kernel_init);
module_exit(hello_kernel_exit);
Um einen Linux-Gerätetreiber (Character-Device, Block-Device usw.) schreiben zu können, müssen Sie ein Kernel-Modul erstellen, das über Ein- und Ausfahrtpunkte verfügt.
Das Kernelmodul alleine macht nichts; Es gibt keine sinnvolle Möglichkeit, mit dem Benutzerraum zu kommunizieren. Über den Einstiegspunkt kann zum Beispiel ein neues Zeichengerät erstellt werden, mit dem dann mit dem Benutzerraum kommuniziert wird.
Das Modul erstellen und ausführen
Zum Kompilieren des Treibers ist der Linux-Kernel-Quellbaum erforderlich.
Angenommen, die Quellen sind /lib/modules/<kernel-version>
. Das folgende Makefile kompiliert die Datei driver.c
in das Kernel-Objekt driver.ko
obj-m := driver.o
KDIR := /lib/modules/$(shell uname -r)/build/
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
Beachten Sie, wie diese Makefile Anrufe make
im Build - Verzeichnis des Kernel.
Wenn der Kompilierungsschritt erfolgreich abgeschlossen wurde, sieht das src-Verzeichnis des Treibers folgendermaßen aus:
driver.c driver.ko driver.mod.c driver.mod.o driver.o Makefile modules.order Module.symvers
Um das Modul "laufen" zu können, müssen Sie Folgendes in den laufenden Kernel einfügen:
$ insmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Hello, World!
$ rmmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Goodbye, cruel world...