1er jour
Programmation noyau
- Développement dans le noyau Linux
- Allocation mémoire et comptage de référence
- Listes chaînées et fifos
Exercise : |
Ecrire le module "hello world" |
Exercise : |
Ajouter un module aux sources du noyau et au menu de configuration |
Exercise : |
Utiliser les paramètres d'un module |
Exercise : |
Ecrire des modules interdépendants, utilisant l'allocation mémoire, le comptage de référence et les listes chaînées |
Debug dans le noyau Linux
- Debug avec /proc et debugfs
- Traces
- L'interface de debug dynamique
- Détection dynamique des erreurs mémoire (kasan et kmemleak)
- Détection des dépendance à des comportements non-prédictibles
- Couverture de code lors des tests
- Debug avec kgdb
- Debug avec une sonde JTAG
Exercise : |
Affichage de traces dynamiques sur un noyau en fonctionnementDebug a module using kgdb |
Exercise : |
Debug de la fonction d'initialisation d'un module avec kgdb |
Multi-tâches noyau
- Gestion des tâches
- Programmation concurrente (mutex, spinlock, atomic_t, rw_semaphore, rwlock, seqlock, RCU)
- Timers
- jiffies (timer_list)
- timers haute résolution (hr_timer)
- threads noyau (kthread)
Exercise : |
Corriger des "race conditions" de l'exercice précédent avec des mutex |
2ème jour
Introduction aux drivers Linux
- Accès au driver depuis une application en mode utilisateur
- Enregistrement du driver
Exercise : |
Implémentation étape par étape d'un driver caractère: |
|
• |
enregistrement du driver (réservation de major/minor) et création du fichier spécial (/dev) |
Pilotes caractère
- Ouverture/fermeture
- Restriction à une seul ouverture/un seul utilisateur
- différence entre "close" et "release"
- Transferts de mémoire entre espace noyau et espace utilisateur
- espaces d'adressage des processus. Swap et pagination
- fonctions de copie entre espaces
- fonctionnement en "zéro copie" grâce au mapping d'adresses utilisateur dans le noyau
- Lecture et écriture
- fonctions de base (read/write)
- lecture/écriture combinées (readv/writev)
- fonctions asynchrones en mode synchrone (aio_read/aio_write)
- Contrôle des périphériques
- fonction ioctl
- choix des codes de commandes
- Support de l'appel système mmap
Exercise : |
Implémentation étape par étape d'un driver caractère: |
|
• |
Implémenter open et release |
|
• |
Implémenter read et write |
|
• |
Implémenter ioctl |
|
• |
Implémenter mmap |
3ème jour
Entrées sorties synchrones et asynchrones
- Synchronisation des tâches
- files d'attente
- mise en attente/réveil d'une tâche
- évènement de complétion
- Entrées/sorties synchrones
Exercise : |
Ecriture des fonctions de lecture/écriture synchrones |
- Entrées/sorties asynchrones
- requêtes non bloquantes
- asynchrone multiplexé (select et poll)
- asynchrone notifié (signal SIGIO)
- asynchrone vrai (totalement parallèle)
Exercise : |
Ajout des fonctions de gestion des E/S asynchrones |
Accès au matériel et interruptions
- Registres mappés en mémoire
- mapping des registres dans un driver
Exercise : |
Driver GPIO accédant directement aux registres, en mode polling |
|