Formation “Écriture de Drivers et Programmation Noyau Linux”

Formation Écriture de Drivers LinuxLe support pour les périphériques (devices) est assuré sous Linux par des pilotes (drivers) dont le code s’exécute dans le noyau du système d’exploitation. Il est donc nécessaire pour le développeur amené à écrire ou à tester des pilotes de périphériques de maîtriser les concepts propres à la programmation noyau.

Ce cours propose une approche originale, s’appuyant sur l’écriture progressive de pilotes de différents types, pour appréhender les mécanismes parfois complexes (préemptibilité, multiprocesseur, support d’architectures différentes, etc.) inhérents au code exécuté en mode noyau.

Outre les périphériques classiques (caractères, blocs, réseaux), on étudie certains sous-systèmes du noyau tels que les systèmes de fichiers ainsi que l’utilisation d’un bus comme PCI Express ou USB.

Points-clés

Durée : 4 jours (3 jours en formation individuelle)

Tarifs 2017-2018 :

  • En nos locaux à Évry (91) : 2280 €HT (déjeuners et collations offerts).
    Tarif dégressif si plusieurs inscrits de la même société à la même session.
  • Prochaines sessions : du 5 au 8 février 2017, 14 au 17 mai 2018. Renseignements et inscriptions : formations@logilin.fr

Pré-requis : connaissance de Linux (utilisateur) et du langage C

Travaux pratiques : les exercices et démonstrations ont lieu, suivant les sujets, sur plate-forme PC, sur carte ARM Raspberry Pi et sur carte ARM BeagleBone Black

Conseil cursus : Les cours “Linux embarqué” et “Temps-réel Linux et Xenomai” représentent de bons compléments pour cette formation.

Plan : Téléchargez le plan détaillé au format PDF.

Thèmes abordés

  • Programmer pour le noyau Linux : noyau (kernel) Linux et modules, outils de développement, API et environnement de fonctionnement du noyau.
  • Périphériques caractère : principes d’écriture d’un pilote de périphérique, appels-systèmes principaux, accès au matériel, GPIO, traitement des interruptions, tasklet, workqueue, threaded interrupt.
  • Driver avancé : entrées-sorties bloquantes, waitqueue, asynchronisme, gestion mémoire, projection mmap, DMA.
  • Périphériques blocs et VFS : principes, traitement des requêtes, partitionnement, ordonnancement des entrées-sorties, VFS.
  • Périphériques PCI Express : enregistrement d’un driver PCIe, BAR, projection en mémoire, interruptions MSI.
  • Périphériques et protocoles réseau : interface réseau, écriture d’un driver bas-niveau, interface et interactions avec la pile IP.
  • Périphériques USB : sous-système USB, enregistrement d’un driver Interrupt, études de drivers Bulk et Control.

Plan détaillé

Première journée de formation – Programmer pour le noyau Linux

1ère séquence 9h00-10h30

  • Noyau Linux et modules : modèle, versions, licence GPL, développement du noyau, appels-systèmes, modules.
  • Travaux pratiques : Observation des appels-système invoqués par des applications et commandes utilisateur. Manipulation des modules précompilés.

2ème séquence 10h45-12h15

  • Outils de développement noyau : sources, compilation du noyau et des modules, écriture et compilation de modules, cross-compilation, messages, dépendances.
  • Travaux pratiques : Compilation et installation d’un noyau. Écriture de modules simples. Intégration dans le noyau. Paramètres au boot. Cross-compilation sur Raspberry Pi.

3ème séquence 13h30-15h15

  • API du noyau : chaînes, blocs mémoire, fonctions numériques et conversions, éléments temporels et actions différées, préemptibilité du noyau.
  • Travaux pratiques : Écriture d’un module d’horodatage. Chronométrage des phases de boot. Mesure de précision d’horloge. Mesure de durée d’un appel-système.

4ème séquence 15h30-17h30

  • Environnement du noyau : tâches et processus current, espaces d’adressage, dialogue avec /proc.
  • Travaux pratiques : Écriture d’un module d’information sur les structures internes des processus. Écriture d’un module d’horodatage via /proc. Tests sur Raspberry Pi

Deuxième journée de formation – Écriture d’un driver

1ère séquence 9h00-10h30

  • Écriture d’un pilote de périphérique : principe, numéros majeurs et mineurs, classes de périphériques, enregistrement du driver, fonctions de lecture et écriture
  • Travaux pratiques : Manipulation des fichiers spéciaux. Réservation de numéro majeur. Enregistrement de périphérique. Écriture d’un driver simple.

2ème séquence 10h45-12h15

  • Appels-système et I/O : paramétrage par ioctl, synchronisation d’appels-système par mutex, accès matériel, ports d’entrées-sorties, GPIO sur carte embarquée.
  • Travaux pratiques : Mise en évidence de la nécessité des mutex. Écriture d’un driver d’entrées-sorties sur GPIO du Raspberry Pi.

3ème séquence 13h30-15h15

  • Gestion d’interruption : contextes d’exécution, installation d’un handler, traitement différé (tasklet, workqueue et thread interrupt).
  • Travaux pratiques :écriture d’un gestionnaire sur interruption clavier PC et sur GPIO du Raspberry Pi, visualisation des threadeds interrupts.

4ème séquence 15h30-17h30

  • Interactions entre appels-système et interruptions : protection des variables globales (spinlock), attentes d’événements (waitqueue), appels-système bloquants.
  • Travaux pratiques : influence des priorités temps-réel sur les threads d’interruption, mesure de temps de latence des interruptions du Raspberry Pi.

Troisième journée de formation – Aspects avancés d’un driver de périphérique

1ère séquence 9h00-10h30

  • Entrées-sorties avancées : multiplexage d’entrée-sorties (select et poll), principes des transferts de données par DMA.

  • Travaux pratiques : Création d’un périphérique “file de messages” virtuel implémentant plusieurs appels-système. Implémentation de select sur des entrées GPIO.

2ème séquence 10h45-12h15

  • Gestion de la mémoire : allocation et libération de mémoire (kmalloc, vmalloc, get_free_pages, kmem_cache), projections (mmap).

  • Travaux pratiques : expériences sur la projection mémoire en espace utilisateur, allocations mémoire maximales.

3ème séquence 13h30-15h15

  • Périphériques blocs et VFS : principes, enregistrement, disque générique, file de requêtes,partitionnement, sous-système Block, i/o scheduler, Virtual File System.

  • Travaux pratiques : écriture d’un driver de disque virtuel, partitionnement, formatage et montage de disque virtuel, observation des effets des caches-disques du VFS.

4ème séquence 15h30-17h30

  • Périphériques PCI Express : principe, détection et enregistrement de driver, Base Address Registers, interruptions classiques et MSI.

  • Travaux pratiques : étude d’un driver PCIe de pilotage d’une carte à FPGA.

Quatrième journée de formation – Autres types de périphériques

1ère séquence 9h00-10h30

  • Périphériques réseau : interfaces bas-niveau et protocoles réseau, périphérique net_device, enregistrement, activation, émission et réception de paquets.
  • Travaux pratiques : écriture progressive d’un driver pour périphérique virtuel permettant l’utilisation du protocole IPv4.

2ème séquence 10h45-12h15

  • Communications réseau : Statistiques d’utilisation d’interface, principes de la pile IP, communications entre protocoles et interface bas-niveau.

  • Travaux pratiques : examen du trajet des données au sein de la pile IPv4 lors de réception et d’émission de données avec le protocole TCP/IP.

3ème séquence 13h30-15h15

  • Utilisation du bus USB : organisation du sous-système USB de Linux, implémentation d’un driver Interrupt, type de endpoints, Communication avec les URB.

  • Travaux pratiques : écriture d’un driver pour carte d’entrée-sortie Velleman K8055

4ème séquence 15h30-16h30

  • Aspects avancés : écritures successives rapides, déconnexions intempestives, accès concurrents, Exemples de drivers Bulk, Control et Isochrones.

  • Conclusion : discussions libres sur l’ensemble des thèmes abordés.
  • Travaux pratiques : Expérimentations libres suivant les demandes des participants.