Le développement de drivers Linux est une compétence rare et recherchée dans l’industrie. Cette formation, alignée sur les noyaux 6.x récents, vous apprend à concevoir des modules noyau en C, à décrire le matériel via Device Tree, à gérer les interruptions, à implémenter des drivers character et block, et à intégrer des périphériques USB ou réseau. Vous découvrez également les outils de diagnostic kernel modernes ftrace, perf, KASAN et lockdep, les alternatives comme eBPF, l’arrivée de Rust dans le mainline, et la sécurité kernel pour un cycle de développement complet du prototype au déploiement.
Public visé
Administrateurs systèmes avec des compétences en développement, développeurs.
Prérequis
Avoir suivi les formations suivantes, ou en maîtriser les thèmes abordés :
Objectifs pédagogiques
À l’issue de cette formation, vous serez capable de :
- Développer des modules noyau et drivers Linux sur kernel 6.x
- Décrire le matériel via Device Tree et l’intégrer au driver
- Diagnostiquer un driver avec ftrace, perf, KASAN et kgdb
- Identifier les cas où eBPF est préférable à un driver
- Situer l’apport de Rust for Linux dans l’écosystème actuel
- Appliquer les meilleures pratiques de l’industrie
- Implémenter la sécurité pour la gestion des accès et des ressources
- Utiliser un assistant IA de façon critique en programmation kernel
Programme
Jour 1
Noyau, modules et matériel
Noyau Linux et écosystème actuel
- situer le développement de drivers dans l’écosystème kernel 6.x
- distinguer userspace et kernel space
- identifier les alternatives modernes — eBPF, Rust for Linux
- reconnaître les types de drivers — character, block, network, misc
- maîtriser le cycle de vie d’un module noyau
Travaux pratiques :
- Écrire et charger un Hello-World Driver, observer les messages dans
dmesg
Environnement et outils de développement
- naviguer dans les sources kernel et les références LWN
- configurer et compiler un noyau avec
make menuconfig - compiler des modules out-of-tree avec Kbuild
- diagnostiquer via les messages noyau —
printk, dynamic debug - gérer les dépendances entre modules —
modprobe,depmod
Travaux pratiques :
- Configurer, compiler un noyau personnalisé, l’installer sur cible et y charger un module out-of-tree
Description du matériel : Device Tree
- comprendre le principe et la syntaxe DTS
- relier driver et DT —
compatible,of_match_table - mettre en œuvre un cas concret sur cible ARM ou via émulation QEMU
Travaux pratiques :
- Décrire un périphérique fictif en Device Tree et écrire le driver correspondant sous QEMU
Gestion des ressources matérielles
- accéder au matériel —
ioremap,request_region, MMIO, port I/O - exploiter le modèle de périphériques Linux
- gérer le DMA et la cohérence de cache
Travaux pratiques :
- Implémenter l’accès MMIO d’un driver de périphérique simple
Threads, scheduling et synchronisation
- distinguer les contextes d’exécution — process, interrupt, softirq
- exploiter threads kernel, scheduler et préemption
- synchroniser les accès — spinlocks, mutex, RCU, completions
- gérer les interruptions en top-half / bottom-half
- maîtriser les API de temps — timers, hrtimers, jiffies
Travaux pratiques :
- Étendre le driver précédent avec un threaded IRQ et une protection par spinlock
Jour 2
Mémoire, périphériques et débogage kernel
Allocation mémoire kernel
- choisir l’allocateur kernel adapté
- comprendre les contraintes des GFP flags —
GFP_KERNEL,GFP_ATOMICselon le contexte - éviter les débordements de pile noyau dont la taille est limitée
- gérer les mappages et la mémoire utilisateur via
mmap
Travaux pratiques :
- Concevoir un cache d’objets via
kmem_cache_createet mesurer son impact
Débogage et diagnostic kernel
- tracer dynamiquement avec ftrace
- profiler avec perf
- instrumenter dynamiquement avec kprobes / uprobes
- déboguer à distance avec kgdb
- détecter les défauts mémoire — KASAN, KFENCE, lockdep, kmemleak
- analyser un panic ou un oops à partir de la stack trace
Travaux pratiques :
- Provoquer une corruption mémoire dans un module, la diagnostiquer sous KASAN puis corriger
Bibliothèques et frameworks kernel
- s’appuyer sur les sous-systèmes existants — input, regmap, GPIO, IIO, hwmon
- privilégier l’intégration aux frameworks plutôt que la réinvention
Travaux pratiques :
- Exposer un capteur fictif via le sous-système IIO
Périphériques caractère et bloc
- implémenter un driver caractère via
cdevet les opérations fichiers - relier le driver au VFS et à l’espace utilisateur
- concevoir un driver bloc avec blk-mq
- déporter le travail — workqueue, tasklets, threaded IRQ
- exploiter les API DMA — cohérence, scatter-gather
Travaux pratiques :
- Implémenter un driver caractère avec une commande
ioctlpersonnalisée
Systèmes de fichiers
- enregistrer un système de fichiers
- gérer les appels lecture/écriture et le page cache
- communiquer avec le sous-système VFS
Travaux pratiques :
- Exposer un mini système de fichiers en mémoire montable
Jour 3
Réseau, USB, sécurité et IA
Drivers réseau
- comprendre l’architecture netdev et NAPI
- créer et activer une interface, exposer ses statistiques
- émettre et recevoir des paquets via
sk_buff - positionner eBPF / XDP pour le fast path
Travaux pratiques :
- Implémenter une interface réseau virtuelle qui boucle les paquets
Périphériques USB
- exploiter le sous-système USB via
usb_driver - communiquer avec le périphérique via URB et endpoints
- gérer hot-plug, déconnexion et multi-périphériques
- intégrer les périphériques PnP
Travaux pratiques :
- Écrire un driver USB minimal pour un périphérique simple ou émulé
Sécurité kernel et bonnes pratiques
- comprendre le modèle de sécurité — capabilities, namespaces
- valider les entrées userspace —
copy_from_user,access_ok - éviter les pièges classiques — TOCTOU, integer overflow, use-after-free
- exploiter les protections matérielles — KASLR, SMEP, SMAP, lockdown
- soigner logs et gestion des panic
Travaux pratiques :
- Auditer un driver pour identifier des vulnérabilités classiques et les corriger
Mise à jour, énergie et firmware
- gérer le versionning et l’ABI/API kernel
- intégrer la gestion d’énergie — runtime PM, suspend/resume
- charger un firmware depuis le driver
Travaux pratiques :
- Ajouter le support runtime PM à un driver existant
C et IA en programmation kernel
- identifier les cas d’usage en programmation kernel
- repérer les pièges spécifiques — APIs internes hallucinées car changent vite entre versions, contextes atomic vs sleepable mal pris en compte, GFP flags incorrects
- formuler des prompts efficaces
- vérifier systématiquement — compilation contre les vrais headers, KASAN, lockdep,
checkpatch.pl
Travaux pratiques :
- Projet final : développer un driver d’un cas d’usage spécifique, le faire passer
checkpatch.plet le valider sous KASAN avec relecture assistée par IA
Modalités d’évaluation des acquis
En cours de formation, par des travaux pratiques. En fin de formation, par un questionnaire d’auto-évaluation.
Voir aussi
Vous serez peut-être intéressés par les formations suivantes :
Formation DEV-C-300 — Conception de drivers en C. Domaine : Développement. Niveau : Avancé. Durée : 3 jours (21 heures). Mots-clés : c, drivers, linux, kernel, système. Cylian Formation, Dijon.