Tutoriel du pilote de périphérique Linux pour les débutants

Tutoriel du pilote de périphérique Linux pour les débutants
Le système d'exploitation Linux contient 3 sections principales: système de fichiers racine, noyau et chargeur de démarrage.

Système de fichiers racine:

Cette partie du système d'exploitation contient des binaires d'applications, des bibliothèques, des scripts, des fichiers de configuration et des fichiers modules à modules à chargement du noyau, etc

Noyau:

Cette partie est le cœur du système d'exploitation, le noyau est responsable de la gestion de toutes les opérations nécessaires pour exécuter le système d'exploitation tel que la gestion de la mémoire, la gestion des processus et les opérations matérielles d'entrée / sortie, etc

Bootloader:

Ceci est la première partie à exécuter par le CPU sur le démarrage. Bootloader contient le code source pour initialiser le système et démarrer l'exécution du noyau et contient des commandes pour déboguer et modifier l'environnement du noyau, il contient également les commandes pour télécharger et mettre à jour le noyau et les images système dans la mémoire flash.

Les conducteurs agissent comme un pont entre le matériel et une application utilisateur, le noyau fournit un mécanisme appelé appels système pour parler au noyau. Dans Linux, les pilotes peuvent être implémentés de deux manières, l'un est que les conducteurs peuvent être compilés dans le cadre du noyau et un autre est que les pilotes peuvent être compilés sous forme de modules et chargés au moment de l'exécution.

Laissez-nous commencer par un simple module de noyau Hello World. Voici le code source d'un simple module de noyau Hello World.

Bonjour.c

#include // nécessaire pour module_init et module_exit
#include // nécessaire pour Kern_info
#include // nécessaire pour les macros
int __init hw_init (void)
printk (kern_info "Hello world \ n");
retour 0;

void __exit hw_exit (void)
printk (kern_info "bye world \ n");

Module_license ("gpl");
module_init (hw_init);
module_exit (hw_exit);

Makefile

obj-m: = Bonjour.o
tous:
Make -c / lib / modules / $ (shell uname -r) / build m = $ (pwd) modules
faire le ménage:
faire -c / lib / modules / $ (shell uname -r) / build m = $ (pwd) propre

Créer un dossier nommé Bonjour puis placer le Bonjour.c et Makefile à l'intérieur. Ouvrir le Terminal Répertoire d'application et de modification en bonjour. Maintenant, exécutez la commande faire et s'il réussit, il devrait générer un fichier de module de noyau chargé appelé Bonjour.ko.

Lorsque vous exécutez faire si vous obtenez la sortie faire: rien à faire pour `` tout ''. Ensuite, assurez-vous que dans le makefile, vous avez entré l'onglet (pas d'espaces) avant de faire -c. En cas de réussite, vous devez obtenir la sortie comme indiqué ci-dessous.

Make [1]: Entrer le répertoire '/ usr / src / linux-headers-3.13.0-128-générique '
Cc [m] / home / John / Desktop / Hello / Hello.o
Modules de construction, étape 2.
Modules modpost 1
CC / Home / John / Desktop / Hello / Hello.mod.o
Ld [M] / Home / John / Desktop / MVS / Pers / Kern / Hello / Hello.ko
Make [1]: Laisser le répertoire '/ usr / src / linux-headers-3.13.0-128-générique '

Maintenant, testons le module en le chargeant dans le noyau. Pour le chargement et le déchargement des modules de noyau, nous devons avoir une autorisation de superutilisateur. Utilisez la commande suivante pour charger le module du noyau dans le noyau.

sudo insmod bonjour.ko

Pour voir le message printk, vous devez vérifier le journal du noyau, pour vérifier le journal du noyau Utilisez la commande suivante.

dmesg

Cette commande publiera les messages de journal du noyau, à la fin, vous devriez voir que notre message Bonjour le monde imprimé.

Pour décharger le module, utilisez la commande suivante.

sudo rmmod bonjour

Pour voir le message printk utilisez à nouveau la commande dmesg et dans le journal du noyau, vous pouvez voir notre message Bye World.

Maintenant, comprenons le code source.

Bonjour.c

Pour commencer à écrire le pilote du noyau, vous pouvez utiliser n'importe quel éditeur ou ide de votre choix, mais le plus souvent les développeurs de noyau préfèrent utiliser vi éditeur.

Chaque module de noyau doit inclure le fichier d'en-tête Linux / module.H Cela a les déclarations et les macros pour les fonctions du noyau telles que module_init et module_exit etc. Les deux fonctions les plus nécessaires pour un pilote de noyau sont les fonctions module_init et module_exit. La fonction dont le pointeur est transmis à module_init sera exécuté lorsque nous chargeons le module dans le noyau, et la fonction dont le pointeur est transmis à module_exit sera appelé lorsque nous déchargeons ou supprimons le module du noyau.

À l'intérieur du noyau pour déboguer et imprimer le journal, nous utilisons imprimer fonction similaire à la fonction printf que nous utilisons dans l'application. Vous pouvez utiliser les macros tels que Kern_info, Kern_err etc… pour spécifier un niveau de journal.

Si nous écrivons un pilote pour parler à un matériel spécifique, la fonction INIT devrait avoir le code pour initialiser le matériel avant de commencer à l'utiliser et la fonction de sortie devrait avoir un code pour nettoyer les ressources (mémoire dynamique, etc.) que nous avons utilisées dans le pilote Avant de sortir du noyau.

Ici, dans cet exemple, nous imprimons simplement les messages de débogage dans les fonctions init et de sortie.

Makefile

Pour construire le module du noyau, nous devons écrire un makefile qui guidera faire utilité comment compiler le module. La syntaxe obj-m est utilisé pour dire au noyau de la marque que le pilote doit être compilé en tant que module à l'aide du fichier d'objet spécifié. Lorsque vous exécutez simplement la commande faire Ensuite, le contrôle arrive au tous: Section du makefile et si vous exécutez la commande se nettoyer Ensuite, le contrôle va au faire le ménage: Section de Makefile. À partir de ce makefile, nous courons réellement faire à l'intérieur du répertoire source du noyau à l'aide de l'option -c. Veuillez vous assurer que le répertoire source du noyau est installé dans votre système. Ici, dans cet exemple, nous avons utilisé la commande uname -r Pour trouver la version actuelle du noyau Linux de votre système.

Nous avons utilisé l'option m = $ (pwd) pour indiquer dans la marque de noyau que la source du pilote est dans le répertoire de travail actuel et nous spécifions le mot modules Pour dire au noyau Makefile de simplement construire des modules et de ne pas construire le code source complet du noyau. Dans faire le ménage: Section de Makefile Nous disons au noyau Makefile de nettoyer les fichiers d'objet générés pour construire ce module.

Cela devrait commencer à compiler et à exécuter votre premier module de noyau.