Aller au contenu

Modules noyaux

Exercice #1: Générez un module noyau out of tree pour la cible NanoPi :

  1. Créez le squelette d’un module noyau et générez-le en dehors des sources du noyau à l’aide d’un Makefile. Le module devra afficher un message lors de son enregistrement et lors de sa désinstallation.
  2. Testez sur la machine hôte la commande modinfo1 sur votre squelette de module et comparez les informations retournées avec celles du code source.
  3. Installez le module (insmod) et contrôlez le log du noyau (dmesg)
  4. Comparez les résultats obtenus par la commande lsmod avec ceux obtenus avec la commande cat /proc/modules
  5. Désinstallez le module (rmmod).
  6. Adaptez le Makefile du module pour autoriser l’installation du module avec les autres modules du noyau permettant l’utilisation de la commande modprobe. Le module devra être installé dans le root filesystem utilisé en cifs par la cible.

Exercice #2: Adaptez le module de l’exercice précédent afin qu’il puisse recevoir deux ou trois paramètres de votre choix. Ces paramètres seront affichés dans la console. Adaptez également le rootfs afin de pouvoir utiliser la commande modprobe.

Exercice #3: Trouvez la signification des 4 valeurs affichées lorsque l’on tape la commande cat /proc/sys/kernel/printk

Gestion de la mémoire, bibliothèque et fonction utile

Exercice #4: Créez dynamiquement des éléments dans le noyau. Adaptez un module noyau, afin que l’on puisse lors de son installation spécifier un nombre d’éléments à créer ainsi qu’un texte initial à stocker dans les éléments précédemment alloués. Chaque élément contiendra également un numéro unique. Les éléments seront créés lors de l’installation du module et chaînés dans l’une liste. Ces éléments seront détruits lors de la désinstallation du module. Des messages d’information seront émis afin de permettre le debugging du module.

Accès aux entrées/sorties

Exercice #5: À l’aide d’un module noyau, afficher le Chip-ID du processeur, la température du CPU et la MAC adresse du contrôleur Ethernet.

  • Les 4 registres de 32 bits du Chip-ID sont aux adresses 0x01c1'4200 à 0x01c1'420c
  • Le registre de 32 bits du senseur de température du CPU est à l’adresse 0x01c2'5080
  • Les 2 registres de 32 bits de la MAC adresse sont aux adresses 0x01c3'0050 et 0x01c3'0054

Pour obtenir la température du CPU, il faut, après lecture du registre, appliquer la formule suivante :

\[ \mathsf{temperature} = -1'191 \cdot \frac{\mathsf{register\, value}}{10} + 223'000\]

Avant d’accéder aux registres du Chip-ID, veuillez réserver la zone mémoire correspondante aux registres du microprocesseur. Validez cette réservation à l’aide de la commande cat /proc/iomem. La commande cat /sys/class/thermal/thermal_zone0/temp permet de valider la bonne lecture de la température. La commande ifconfig permet de valider la bonne lecture de la MAC adresse.

Threads du noyau

Exercice #6: Développez un petit module permettant d’instancier un thread dans le noyau. Ce thread affichera un message toutes les 5 secondes. Il pourra être mis en sommeil durant ces 5 secondes à l’aide de la fonction ssleep(5) provenant de l’interface <linux/delay.h>.

Mise en sommeil

Exercice #7: Développez un petit module permettant d’instancier deux threads dans le noyau. Le premier thread attendra une notification de réveil du deuxième thread et se remettra en sommeil. Le 2ème thread enverra cette notification toutes les 5 secondes et se rendormira. On utilisera les waitqueues pour les mises en sommeil. Afin de permettre le debugging du module, chaque thread affichera un petit message à chaque réveil.

Interruptions

Exercice #8: Développez un petit module permettant de capturer les pressions exercées sur les switches de la carte d’extension par interruption. Afin de permettre le debugging du module, chaque capture affichera un petit message.

Quelques informations pour la réalisation du module :

  1. Acquérir la porte GPIO avec le service gpio_request (<io_nr>, <label>);
  2. Obtenir le vecteur d’interruption avec le service gpio_to_irq (<io_nr>);
  3. Informations sur les switches de la carte d’extension
    • k1 - gpio: A, pin_nr=0, io_nr=0
    • k2 - gpio: A, pin_nr=2, io_nr=2
    • k3 - gpio: A, pin_nr=3, io_nr=3

Archives 2021/2022


  1. Pour installer modinfo, ajoutez le package “kmod utilities” : Target PackagesSystem Toolskmod et kmod utilities. Vous pouvez ensuite mettre à jour le root file system avec la commande extract-rootfs.sh, mais attention, vous allez remplacer des fichiers tels que /etc/fstab. Sauvegardez vos fichiers importants!