Noyau Linux et développement de Drivers

Une formation ciblée pour maîtriser la programmation noyau sous Linux.

Objectif

Cette formation va permettre à des ingénieurs de développement maîtrisant la programmation en C de concevoir, développer et déployer un pilote de périphérique pour le noyau Linux. 

Le but de la formation est d'aborder les points suivants :

  • Introduction à l'architecture du noyau Linux (sources, configuration, compilation native ou croisée)
  • API des modules Linux
  • Pilotes en mode caractère (char drivers)
  • Concepts « avancés » (interruptions, accès au matériel, registres d'I/O, mémoire, kernel threads)
  • Traitement des bus PCI et USB
  • Introduction aux pilotes en bloc (block drivers) et réseau (network drivers)
  • Mise au point en espace noyau

Les stagiaires utiliseront leur PC (Windows ou Linux) ou MacBook (Mac OS X 10.5 ou plus) car l'environnement de développement est intégré à une imageVirtualBoxcontenant également les supports de cours.  

A l'issue de cette formation, vous serez en mesure de prendre en charge intégralement le développement d'un pilote de périphérique sous Linux.

Public visé

Cette formation s'adresse aux ingénieurs de développement embarqué, chefs de projets techniques ou responsables de la fourniture de BSP qui souhaitent acquérir les compétences nécessaires à la conception et à la réalisation de pilotes de périphériques pour le noyau Linux.

Pré-requis

Les connaissances nécessaires pour la participation au stage sont les suivantes :

  • Connaissance utilisateur Linux ou à défaut UNIX
  • Bonne notions de langage C
  • Quelques notions de manipulation de la ligne de commande (shell)

Le stagiaire utilisera son PC portable (ou un MacBook) pour la formation. La machine devra satisfaire aux pré-requis suivants :

  • Système d'exploitation Windows (XP ou supérieur), Linux ou bien MacBook sous Mac OS X 10.5 ou supérieur.
  • Droits administrateur sur le système Windows ou MacOS X afin d'ajouter l'image VirtualBox
  • La machine devra disposer AU MINIMUM de 2 Go de mémoire vive et de 20 Go d'espace libre sur le disque.

Le nombre de participants ne pourra excéder les 8 stagiaires.

Programme

La formation s'effectue sur 4 journées de 7 h, soit 28 h de cours. Les thèmes abordés sont les suivants :

Introduction au noyau Linux

  • Principes, espaces utilisateur et noyau
  • Historique
  • Principaux concepts
  • Nommage des versions
  • Licences
  • Compilation native et croisée d'un noyau standard

Modules Linux

  • Développement en espace noyau
  • API des modules Linux, écriture d'un module « Hello World »
  • Les fonctions module_init() et module_exit()
  • Manipulation des modules avec insmod, modprobe, rmmod, lsmod, modinfo
  • Macros d'identification des modules (MODULE_LICENSE, etc.)
  • Dépendances des modules
  • Passage de paramètres

Pilotes en mode caractère

  • Rappel sur les pilotes UNIX
  • Pilote statique et dynamique
  • Les différents types de pilotes (char, block, network)
  • Structure d'un pilote en mode caractère (char)
  • Principales fonctions du pilote →open(), release(), read(), write(), ioctl(), …
  • Interface avec l'espace utilisateur (majeur et mineur) différentes méthodes d'allocation
  • La structure file_operations
  • Les classes de pilotes, utilisation de la classe misc, création de classe
  • Échanges de données avec l'espace utilisateur →copy_from_user(), copy_to_user()
  • Traitement des interruptions (top-half, bottom-half, wait queue)
  • Threads noyau
  • Ports et mémoire d'entrée sortie (request et release)
  • Projection en mémoire, utilisation de mmap()
  • Verrouillage (spinlock et mutex)
  • Mesure du temps et compteurs

Bus PCI

  • Introduction générale au bus PCI (historique, versions, performances)
  • Ressources d'un périphérique PCI (Base Address Register, interruptions)
  • Registres de configuration
  • Le bus PCI sous Linux
  • Utilisation de lspci
  • Écriture d'un pilote PCI générique
  • Table des identifiants (pci_device_id)
  • Descripteur de pilote (struct pci_driver)
  • Allocation et libération, fonctions probe() et remove()
  • Ajout d'une interface en mode caractère (char driver)
  • Test du pilote sur la carte réseau du PC virtuel

Bus USB

  • Introduction générale au bus USB (historique, versions)
  • Contrôleur (OHCI, EHCI) et connectique
  • Principe de fonctionnement host et device
  • Structure du périphérique →device,configuration(s),interface(s),endpoint(s)
  • Les messages USB → CONTROL, INTERRUPT, BULK, ISOCHRONOUS
  • Le bus USB sous Linux
  • Utilisation de lsusb
  • Écriture d'un pilote USB pour un périphérique simple de type HID (Human Interface Device)
    • Table des identifiants (usb_device_id)
    • Descripteur de pilote (struct usb_driver)
    • Allocation et libération, fonctions probe() et disconnect()
    • Ajout d'une interface en mode caractère (char driver), structureusb_class_driver
    • Test du pilote sur la carte réseau du PC virtuel (tablette virtuelle) et sur un périphérique réel (Big Red Button)
  • Utilisation de UDEV, gestion de l'attachement et du détachement d'un périphérique HID
  • Cas général d'URB (USB Request Block)
  • Mise au point avec USBMON
  • Écriture de « pilote » USB en espace utilisateur, introduction à hidraw et libusb  

Interfaces/bus divers (GPIO, I2C, SPI)

  • Interfaces de la carte Raspberry Pi
  • GPIO sous Linux en espace utilisateur et noyau (génération d'une interruption)
  • Bus I2C et SPI sous Linux (afficheur 7 segments et capteur de luminosité)

Introduction aux pilotes réseau

  • Rappels sur le réseau sous Linux
  • Spécificité des pilotes réseau, positionnement par rapport à la pile et au bus (PCI, USB, ...)
  • Les fonctions d'un pilote réseau →open(),stop(), start_xmit(), …
  • Les structures net_device et net_device_ops
  • Manipulation du socket buffer (struct sk_buff)
  • Écriture d'un pilote réseau minimal faketh, création de l'interface fake0
  • Test du pilote avec l'outil tcpdump
  • Pilotes réseau PCI et USB, introduction à USBnet
  • Introduction à la NAPI

Introduction aux pilotes en mode bloc

  • Architecture d'un pilote en mode bloc (block driver), notion degendisk
  • Développement d'un pilote de disque mémoire (ramdisk) → SBD (Simple Block Device)
    • Initialisation
    • Déclaration du nouveau disque
    • Gestion des requêtes
  • Test du pilote → partitionnement, formatage, lecture et écriture de données

Mise au point en espace noyau

  • Mise au point etprofilingsous Linux
  • Introduction à GDB
  • Exemple de l'agent GDB SERVER (espace utilisateur)
  • Agents pour la mise au point noyau
  • Sonde JTAG
  • Émulateur QEMU
  • KGDB
  • Mise au point du noyau statique (analyse de kernel panic)
  • Mise au point d'un module dynamique (.ko)
  • Introduction à Ftrace (profiling noyau)
  • Utilisation de trace-cmd et kernel shark

Les travaux pratiques pourront être adaptés au contexte client pour les formations intra-entreprises