2.12. Compilation de modules de noyau personnalisés
Vous pouvez créer un module de noyau d'échantillonnage en fonction des différentes configurations matérielles et logicielles.
Conditions préalables
Vous avez installé les paquets
kernel-devel
,gcc
etelfutils-libelf-devel
.# dnf install kernel-devel-$(uname -r) gcc elfutils-libelf-devel
- Vous disposez des droits d'accès à la racine.
-
Vous avez créé le répertoire
/root/testmodule/
dans lequel vous compilez le module de noyau personnalisé.
Procédure
Créez le fichier
/root/testmodule/test.c
avec le contenu suivant.#include <linux/module.h> #include <linux/kernel.h> int init_module(void) { printk("Hello World\n This is a test\n"); return 0; } void cleanup_module(void) { printk("Good Bye World"); } MODULE_LICENSE("GPL");
Le fichier
test.c
est un fichier source qui fournit les principales fonctionnalités du module du noyau. Le fichier a été créé dans un répertoire/root/testmodule/
dédié à des fins d'organisation. Après la compilation du module, le répertoire/root/testmodule/
contiendra plusieurs fichiers.Le fichier
test.c
inclut les bibliothèques du système :-
Le fichier d'en-tête
linux/kernel.h
est nécessaire pour la fonctionprintk()
dans le code d'exemple. Le fichier
linux/module.h
contient des déclarations de fonctions et des définitions de macros à partager entre plusieurs fichiers sources écrits en langage de programmation C.Suivez ensuite les fonctions
init_module()
etcleanup_module()
pour démarrer et terminer la fonction d'enregistrement du noyauprintk()
, qui imprime du texte.
-
Le fichier d'en-tête
Créez le fichier
/root/testmodule/Makefile
avec le contenu suivant.obj-m := test.o
Le Makefile contient des instructions selon lesquelles le compilateur doit produire un fichier objet spécifiquement nommé
test.o
. La directiveobj-m
spécifie que le fichiertest.ko
résultant sera compilé en tant que module de noyau chargeable. Alternativement, la directiveobj-y
indiquerait de compilertest.ko
en tant que module de noyau intégré.Compiler le module du noyau.
# make -C /lib/modules/$(uname -r)/build M=/root/testmodule modules make: Entering directory '/usr/src/kernels/5.14.0-70.17.1.el9_0.x86_64' CC [M] /root/testmodule/test.o MODPOST /root/testmodule/Module.symvers CC [M] /root/testmodule/test.mod.o LD [M] /root/testmodule/test.ko BTF [M] /root/testmodule/test.ko Skipping BTF generation for /root/testmodule/test.ko due to unavailability of vmlinux make: Leaving directory '/usr/src/kernels/5.14.0-70.17.1.el9_0.x86_64'
Le compilateur crée un fichier objet (
test.o
) pour chaque fichier source (test.c
) en tant qu'étape intermédiaire avant de les lier ensemble dans le module final du noyau (test.ko
).Après une compilation réussie,
/root/testmodule/
contient des fichiers supplémentaires relatifs au module de noyau personnalisé compilé. Le module compilé lui-même est représenté par le fichiertest.ko
.
Vérification
Facultatif : vérifiez le contenu du répertoire
/root/testmodule/
:# ls -l /root/testmodule/ total 152 -rw-r—r--. 1 root root 16 Jul 26 08:19 Makefile -rw-r—r--. 1 root root 25 Jul 26 08:20 modules.order -rw-r—r--. 1 root root 0 Jul 26 08:20 Module.symvers -rw-r—r--. 1 root root 224 Jul 26 08:18 test.c -rw-r—r--. 1 root root 62176 Jul 26 08:20 test.ko -rw-r—r--. 1 root root 25 Jul 26 08:20 test.mod -rw-r—r--. 1 root root 849 Jul 26 08:20 test.mod.c -rw-r—r--. 1 root root 50936 Jul 26 08:20 test.mod.o -rw-r—r--. 1 root root 12912 Jul 26 08:20 test.o
Copiez le module du noyau dans le répertoire
/lib/modules/$(uname -r)/
:# cp /root/testmodule/test.ko /lib/modules/$(uname -r)/
Mise à jour de la liste des dépendances modulaires :
# depmod -a
Charger le module du noyau :
# modprobe -v test insmod /lib/modules/5.14.0-1.el9.x86_64/test.ko
Vérifiez que le module du noyau a été chargé avec succès :
# lsmod | grep test test 16384 0
Lire les derniers messages du tampon circulaire du noyau :
# dmesg [74422.545004] Hello World This is a test
Ressources supplémentaires