GNU/Linux >> Tutoriels Linux >  >> Linux

Comment écrire votre propre module de noyau Linux avec un exemple simple

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//kernel/.

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.


Linux
  1. Comment utiliser la commande Rmmod sous Linux avec des exemples

  2. Linux - Comment déterminer quel module corrompt le noyau ?

  3. Linux – Un noyau corrompu sous Linux ?

  4. Comment créer des threads sous Linux (avec un exemple de programme C)

  5. Comment coder un module du noyau Linux ?

Comment sauver votre système Windows ou Linux avec Rescatux

Comment créer sa propre distribution Linux avec Yocto sur Ubuntu

Comment trouver la version du noyau Linux en cours d'exécution sur votre PC

Comment surveiller vos serveurs Linux avec Checkmk

Cron Vs Anacron :Comment configurer Anacron sous Linux (avec un exemple)

Comment créer facilement votre propre distribution Linux ?