Que sont les modules du noyau ?
Les modules du noyau sont des morceaux de code qui peuvent être chargés et déchargés du noyau à la demande.
Les modules du noyau offrent un moyen simple d'étendre les fonctionnalités du noyau de base sans avoir à reconstruire ou recompiler le noyau à nouveau. La plupart des pilotes sont implémentés en tant que modules du noyau Linux. Lorsque ces pilotes ne sont pas nécessaires, nous ne pouvons décharger que ce pilote spécifique, ce qui réduira la taille de l'image du noyau.
Les modules du noyau auront une extension .ko. Sur un système Linux normal, les modules du noyau résideront dans le répertoire /lib/modules/
Plus tôt, nous avons expliqué comment compiler un noyau à partir de la source.
Ce tutoriel explique comment écrire un module Kernel à l'aide d'un exemple simple Hello World.
Je. Utilitaires pour manipuler les modules du noyau
1. lsmod - Liste des modules déjà chargés
La commande lsmod listera les modules qui sont déjà chargés dans le noyau comme indiqué ci-dessous.
# lsmod Module Size Used by ppp_deflate 12806 0 zlib_deflate 26445 1 ppp_deflate bsd_comp 12785 0 ..
2. insmod - Insérer le module dans le noyau
La commande insmod insérera un nouveau module dans le noyau comme indiqué ci-dessous.
# insmod /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko # lsmod | grep "squash" squashfs 35834 0
3. modinfo - Afficher les informations sur le module
La commande modinfo affichera des informations sur un module du noyau comme indiqué ci-dessous.
# 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 - Supprimer le module du noyau
La commande rmmod supprimera un module du noyau. Vous ne pouvez pas supprimer un module déjà utilisé par un programme.
# rmmod squashfs.ko
5. modprobe – Ajouter ou supprimer des modules du noyau
modprobe est une commande intelligente qui charge/décharge les modules en fonction de la dépendance entre les modules. Reportez-vous aux commandes modprobe pour des exemples plus détaillés.
II. Écrire un module de noyau Hello World simple
1. Installation des en-têtes Linux
Vous devez d'abord installer linux-headers-.. comme indiqué ci-dessous. Selon votre distribution, utilisez apt-get ou yum.
# apt-get install build-essential linux-headers-$(uname -r)
2. Code source du module Hello World
Ensuite, créez le module hello.c suivant en langage de programmation 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);
Avertissement : Tous les modules du noyau fonctionneront sur l'espace du noyau, un mode hautement privilégié. Faites donc attention à ce que vous écrivez dans un module du noyau.
3. Créer un Makefile pour compiler le module du noyau
Le fichier makefile suivant peut être utilisé pour compiler le module noyau hello world de base ci-dessus.
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
Utilisez la commande make pour compiler le module hello world kernel comme indiqué ci-dessous.
# 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'
Ce qui précède créera le fichier hello.ko, qui est notre exemple de module Kernel.
4. Insérer ou retirer l'exemple de module de noyau
Maintenant que nous avons notre fichier hello.ko, nous pouvons insérer ce module dans le noyau en utilisant la commande insmod comme indiqué ci-dessous.
# insmod hello.ko # dmesg | tail -1 [ 8394.731865] Hello world! # rmmod hello.ko # dmesg | tail -1 [ 8707.989819] Cleaning up module.
Lorsqu'un module est inséré dans le noyau, la macro module_init sera appelée, qui appellera la fonction hello_init. De même, lorsque le module est supprimé avec rmmod, la macro module_exit sera invoquée, qui appellera hello_exit. En utilisant la commande dmesg, nous pouvons voir la sortie de l'exemple de module Kernel.
Veuillez noter que printk est une fonction définie dans le noyau et qu'elle se comporte de la même manière que printf dans la bibliothèque IO. N'oubliez pas que vous ne pouvez utiliser aucune des fonctions de la bibliothèque du module du noyau.
Vous avez maintenant appris les bases pour créer votre propre module Linux Kernel.