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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow