Rechercher

2.12. Compilation de modules de noyau personnalisés

download PDF

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 et elfutils-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

  1. 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 fonction printk() 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() et cleanup_module() pour démarrer et terminer la fonction d'enregistrement du noyau printk(), qui imprime du texte.

  2. 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 directive obj-m spécifie que le fichier test.ko résultant sera compilé en tant que module de noyau chargeable. Alternativement, la directive obj-y indiquerait de compiler test.ko en tant que module de noyau intégré.

  3. 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 fichier test.ko.

Vérification

  1. 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
  2. Copiez le module du noyau dans le répertoire /lib/modules/$(uname -r)/:

    # cp /root/testmodule/test.ko /lib/modules/$(uname -r)/
  3. Mise à jour de la liste des dépendances modulaires :

    # depmod -a
  4. Charger le module du noyau :

    # modprobe -v test
    insmod /lib/modules/5.14.0-1.el9.x86_64/test.ko
  5. Vérifiez que le module du noyau a été chargé avec succès :

    # lsmod | grep test
    test                   16384  0
  6. Lire les derniers messages du tampon circulaire du noyau :

    # dmesg
    [74422.545004] Hello World
                    This is a test

Ressources supplémentaires

Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.