Formation Noyau linux et développement de drivers

Ref :

Embarqué & IoT Durée :
4 jours
Lieu :
Paris - Grenoble - Toulouse - Nantes

Tarif

Intra :
Inter :
2190€ HT / personne
Inscrivez-vous

Demande d'informations

Les prochaines dates

Du : 20 novembre 2017 Au : 23 novembre 2017

Pré-requis

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

Public concerné

  • Ingénieurs de développement embarqué et chefs de projets techniques.
  • Responsables de la fourniture de BSP

Objectifs

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.

Programme détaillé

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

Nos Actualités