linux-kernel
Pilote Linux Hello World Device
Recherche…
Un module noyau vide
#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);
Pour écrire un pilote de périphérique Linux (Character-device, Block-device, etc.), il est nécessaire de créer un module de noyau comportant des points d'entrée et de sortie.
En soi, le module du noyau ne fait rien; il n'a aucun moyen significatif de communiquer avec l'espace utilisateur. En utilisant le point d'entrée, il est possible de créer un nouveau périphérique de caractère, par exemple, qui est ensuite utilisé pour communiquer avec l'espace utilisateur.
Construire et exécuter le module
Pour compiler le pilote, il est nécessaire d’avoir l’arbre source du noyau Linux.
En supposant que les sources se trouvent dans /lib/modules/<kernel-version>
, le fichier Makefile suivant compilera le fichier driver.c
dans l' driver.ko
noyau driver.ko
obj-m := driver.o
KDIR := /lib/modules/$(shell uname -r)/build/
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
Remarquez comment ces appels Makefile sont make
dans le répertoire de compilation du noyau.
Lorsque l'étape de compilation se termine avec succès, le répertoire src du pilote ressemblera à ceci:
driver.c driver.ko driver.mod.c driver.mod.o driver.o Makefile modules.order Module.symvers
Pour "exécuter" le module, il est nécessaire d'insérer dans le noyau en cours d'exécution:
$ insmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Hello, World!
$ rmmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Goodbye, cruel world...