mardi 9 juin 2009

Développer son propre module noyau sous Linux

Cet article explique comment coder son propre module noyau sous Linux. Il s’adresse aux débutants et ne nécessite pas forcément beaucoup de connaissances en programmation.

1. Les pré-requis

Pour pouvoir développer son propre module noyau, il vous faudra disposer du paquet kernel headers et d'un compilateur de langage c comme gcc par exemple.

Pour installer ces différents composants, ouvrez un terminal en root et lancez la commande suivante pour une distribution à base de rpm :

yum install kernel-headers gcc

Ou celle-ci pour une distribution à base de Debian :

sudo aptitude install linux-headers-`uname -r` build-essential


2. Le développement d'un module noyau

Voici un exemple assez simple de code source d'un module noyau. Celui-ci affiche simplement un "Hello world" à l'initialisation et un "Goodbye world" lors du déchargement du module. Le nom du fichier contenant ce code s'intitulera hello.c :

#include
#include

#define DRIVER_AUTHOR "Sebastien Bilbeau"
#define DRIVER_DESC "My First module"

int init_module(void) {
printk(KERN_INFO "Hello world.\n");
return 0;
}

void cleanup_module(void) {
printk(KERN_INFO "Goodbye world\n");
}

MODULE_LICENSE("GPL"); // La licence du module
MODULE_AUTHOR(DRIVER_AUTHOR); // L'auteur du module
MODULE_DESCRIPTION(DRIVER_DESC); // La description du module


3. La compilation du module

Pour compiler le module, lancez la commande suivante. Si tout se passe bien, un fichier hello.ko sera alors créé :

chmod 755 hello.c
make -C `ls -d /lib/modules/$(uname -r)/build` M=`pwd` modules


4. L'utilisation du module

Attention, pour manipuler un module, il faut nécessairement avoir les droits root. Pour le charger, il faudra utiliser la commande insmod comme ceci :

insmod hello.ko

On pourra vérifier qu'il est bien chargé en utilisant lsmod :

lsmod | grep hello

Si vous souhaitez afficher les informations relatives au module :

[root@localhost ~]# modinfo hello.ko
filename: hello.ko
description: My First module
author: Sebastien Bilbeau
license: GPL

Dans le code de hello.c, nous avons utilisé la fonction printk, qui permet d'écrire un message dans le fichier /var/log/message. Nous allons donc maintenant observer le résultat de notre petit programme :

[root@localhost ~]# cat /var/log/messages | grep -i hello
Jan 19 23:21:03 localhost kernel: Hello world.

Enfin, on pourra décharger le tout avec la commande rmmod :

rmmod hello.ko

Vous connaissez désormais les bases du développement des modules noyau pour Linux.

Aucun commentaire:

Enregistrer un commentaire