View the site in Français Site displayed in Anglais (USA) View the site in Anglais (GB)
You are here: ac6 > ac6-formation > Linux > Linux drivers
Download Catalog
Download Catalog
Download as PDF
Download as PDF
Write us
Write us
Printable version
Printable version
 

D3 Linux drivers

Writing Linux drivers

Writing Linux drivers

formateur
Objectifs
bullet_jaune_1 Maîtriser les outils kernel de développement et de mise au point
bullet_jaune_1 Programmer les IO, les interruptions, les timers, le DMA
bullet_jaune_1 Adapter les sources des drivers du marché
bullet_jaune_1 Installer et intégrer les drivers dans un kernel linux
bullet_jaune_1 Gérer les interfaces standard synchrones, asynchrones et ioctl
bullet_jaune_1 Développer les structures des drivers caractères, blocs et réseaux
bullet_jaune_1 Comprendre les spécificités de la version 2.6
bullet_jaune_1 Connaître les évolutions qui ont eu lieu jusqu'au noyau 2.6.23
Tous les exercices se font en binôme sur cible PowerPC 405GPr, ARM 926 ou STMicroelectronics ST40 en réseau avec la station de développement des stagiaires
Matériel
bullet_jaune_2 Un PC Linux par binôme
bullet_jaune_2 Support de cours
bullet_jaune_2 CDROM avec documentation et exercices corrigés
Pré-requis
bullet_jaune_2 Connaissance de la programmation Linux utilisateur et système (niveau cours D0)

Outline
1er jour
Présentation & Architecture
bullet_jaune_2 Historique
bullet_jaune_2 Licences GPL et open source
bullet_jaune_2 Distributions et versions de Linux
bullet_jaune_2 Architecture du kernel Linux
Programmation Linux Noyau
bullet_jaune_2 Outils de développement
bullet_jaune_3 outils de compilation
bullet_jaune_3 sources de documentation
bullet_jaune_3 makefile
bullet_jaune_2 Développement des modules noyaux
bullet_jaune_3 différences entre applications utilisateur et noyau
bullet_jaune_3 écriture d'un module noyau (licence, paramètres, exportation de symboles)
bullet_jaune_3 chargement et gestion des versions des modules noyau
Exercice : Ecriture d'un module simple
bullet_jaune_2 La structure objet du noyau Linux
bullet_jaune_3 kobject, kset, subsystems
Exercice : Fabrication d'un objet noyau
bullet_jaune_3 lien avec le système de fichiers sysfs
Exercice : Modification dynamique des attributs et appel de méthodes de l'objet à travers sysfs
bullet_jaune_2 La modélisation des périphériques Linux (2.6)
bullet_jaune_3 Linux Device Model
bullet_jaune_3 Le hotplug
bullet_jaune_2 Debug noyau
bullet_jaune_3 traces dans le code noyau (printk)
bullet_jaune_3 messages Oops!
bullet_jaune_3 patchs permettant le debug noyau (kgdb, ikd)
Exercice : Réalisation d'un système simple de génération sélective dynamique de traces noyau
bullet_jaune_2 Allocation mémoire
bullet_jaune_3 algorithme d’allocation mémoire buddy et slab/slob/slub
bullet_jaune_3 allocations bloquantes ou "atomiques"
bullet_jaune_3 limitations de l'allocation dynamique et intérêt de l'allocation statique au boot
bullet_jaune_2 Boot des drivers
bullet_jaune_3 zones mémoire d’allocations des drivers
bullet_jaune_3 allocation dynamique et au boot
2ème jour
Multi-tâches Noyau
bullet_jaune_2 Gestion des tâches
bullet_jaune_3 task struct
bullet_jaune_3 pile noyau et détermination de la tâche courante (macro "current")
bullet_jaune_3 quotas d'utilisation des ressources (temps CPU, occupation mémoire, fichiers ouverts...)
bullet_jaune_2 Programmation concurrente
bullet_jaune_3 quand et comment masquer la préemption
bullet_jaune_3 spinlocks (simples et "lecture/écriture")
bullet_jaune_3 seqlocks (nouveaux en 2.6)
bullet_jaune_3 sémaphores
bullet_jaune_3 RCU (nouveaux en 2.6)
Exercice : Protection des méthodes d'un objet noyau contre une exécution parallèle
bullet_jaune_2 Timers
bullet_jaune_3 jiffies
bullet_jaune_3 timers haute résolution
bullet_jaune_2 Envoi de signaux
Exercice : Mise en évidence des problèmes possibles à l'aide de timers
Introduction aux drivers Linux
bullet_jaune_2 Intégration d'un pilote dans les sources de Linux
bullet_jaune_3 fichiers Makefile du noyau
bullet_jaune_3 fichiers Kconfig (description de l'interface de configuration du noyau)
bullet_jaune_2 Concepts des pilotes Linux
bullet_jaune_3 Pilote en mode utilisateur/pilote en mode noyau
bullet_jaune_3 numéros majeur/mineur et devnums (nouveau en 2.6). Fichiers spéciaux
bullet_jaune_3 installation d'un pilote
bullet_jaune_3 structures associées aux pilotes (struct inode, struct file, file descriptor)
bullet_jaune_2 Transferts de mémoire entre espace noyau et espace utilisateur
Exercice : Ecriture du code d'initialisation d'un pilote
Pilotes caractère
bullet_jaune_2 Ouverture/fermeture
bullet_jaune_3 Restriction à une seul ouverture/un seul utilisateur
bullet_jaune_3 différence entre "close" et "release"
Exercice : Ecriture du code d'initialisation d'un driver logiciel
bullet_jaune_2 Transferts de mémoire entre espace noyau et espace utilisateur
bullet_jaune_3 différences entre adresses virtuelles, logiques, physiques et bus
bullet_jaune_3 espaces d'adressage des processus. Swap et pagination
bullet_jaune_3 fonctions de copie entre espaces
bullet_jaune_3 fonctionnement en "zéro copie" grâce au mapping d'adresses utilisateur dans le noyau
bullet_jaune_2 Lecture et écriture
bullet_jaune_3 fonctions de base (read/write)
bullet_jaune_3 lecture/écriture combinées (readv/writev)
bullet_jaune_3 fonctions asynchrones en mode synchrone (aio_read/aio_write)
Exercice : Ecriture des routines de lecture-écriture d'un pilote logiciel (version sans synchronisation)
bullet_jaune_2 Contrôle des périphériques
bullet_jaune_3 fonction ioctl
bullet_jaune_3 choix des codes de commandes
Exercice : Modification des paramètres du périphérique à travers un IOCTL
3ème jour
Entrées sorties synchrones et asynchrones
bullet_jaune_2 Synchronisation des tâches
bullet_jaune_3 files d'attente
bullet_jaune_3 mise en attente/réveil d'une tâche
bullet_jaune_3 attente exclusive
bullet_jaune_3 attente sur un bit (nouveau en 2.6)
bullet_jaune_3 évènement de complétion
bullet_jaune_2 Entrées/sorties synchrones
Exercice : Ecriture des fonctions de lecture/écriture synchrones
bullet_jaune_2 Entrées/sorties asynchrones
bullet_jaune_3 requêtes non bloquantes
bullet_jaune_3 asynchrone multiplexé (select et poll)
bullet_jaune_3 asynchrone notifié (signal SIGIO)
bullet_jaune_3 asynchrone vrai (totalement parallèle)
Exercice : Ajout des fonctions de gestion des E/S asynchrones
Accès au matériel et interruptions
bullet_jaune_2 Accès aux registres des périphériques
bullet_jaune_3 Espace d'IO et espace de mémoire physique
bullet_jaune_3 réservation et utilisation des ports d'IO (espace d'IO)
bullet_jaune_3 réservation et utilisation des plages d'IO en espace physique
bullet_jaune_3 mapping des registres dans un pilote
bullet_jaune_3 problèmes d'optimisation (cache, out-of-order, volatile)
Exercice : Ecriture d'un pilote d'entrées/sorties parallèles (GPIO)
bullet_jaune_2 Direct Memory Access (DMA)
bullet_jaune_3 Slave DMA (ISA)
bullet_jaune_3 DMA Bus Master (PCI)
bullet_jaune_3 mapping d'un buffer noyau dans l'espace du périphérique
bullet_jaune_3 intérêts des mappings permanent ("coherent mapping") et temporaire ("streaming DMA")
bullet_jaune_2 Spécificités des interfaces PCI
bullet_jaune_3 énumération
bullet_jaune_3 espace de configuration
bullet_jaune_3 association dynamique pilote/périphérique (hotplug)
bullet_jaune_2 Interruptions
bullet_jaune_3 cas du SMP
bullet_jaune_3 IRQ, ISR, "top half" et "bottom halves" (softirq, tasklet, work_queue)
bullet_jaune_3 contexte d'exécution des gestionnaires d'interruption (atomique)
bullet_jaune_3 partage d'interruptions
bullet_jaune_3 synchronisation entre code noyau, "top half" et "bottom halves"
bullet_jaune_3 fonctions atomiques
Exercice : Ajout d'un mécanisme d'attente de changement d'état de la GPIO sur interruption
4ème jour
Pilotes bloc
bullet_jaune_2 structures
bullet_jaune_3 représentation d'un disque (struct gendisk)
bullet_jaune_3 file des requêtes (struct request queue)
bullet_jaune_2 interface
bullet_jaune_3 chargement/déchargement (open/release)
bullet_jaune_3 gestion des media amovibles
bullet_jaune_3 contrôle (ioctl). Ioctl de description de la géométrie du disque
bullet_jaune_2 routine de stratégie
bullet_jaune_3 relation entre lecture/écriture et routine de stratégie
bullet_jaune_3 algorithmes d'ordonnancement des requêtes ("elevators")
bullet_jaune_3 structures décrivant les requêtes (struct bio et bio_vec)
Exercice : Analyse d'un pilote de Ramdisk
Pilotes réseaux
bullet_jaune_2 structures
bullet_jaune_3 représentation d'une interface réseau (struct net_device)
bullet_jaune_3 paquet réseau (struct sk_buff)
bullet_jaune_2 Cas du "scatter/gather"
bullet_jaune_2 interface
bullet_jaune_3 réception de paquet
bullet_jaune_3 envoi de paquet
bullet_jaune_3 gestion des paquets perdus
bullet_jaune_3 statistiques de l'interface
bullet_jaune_2 Nouvelles API réseau (NAPI, nouveau en 2.6)
bullet_jaune_3 "interrupt mitigation" (suppression des IRQ inutiles)
bullet_jaune_3 "paquet throttling" (désengorgement des couches protocolaires)
Pilotes USB
bullet_jaune_2 La norme USB
bullet_jaune_3 notion de configuration
bullet_jaune_3 notion d'interface (rôle d'un périphérique)
bullet_jaune_3 notion de terminaison (canal de communication)
bullet_jaune_3 types des terminaisons (contrôle, interruption, bloc, isochrone)
bullet_jaune_2 Drivers USB host
bullet_jaune_3 intégration des pilotes USB dans le noyau (usbcore)
bullet_jaune_3 gestion du hotplug
bullet_jaune_3 requêtes asynchrones par URB (USB request block)
bullet_jaune_3 requêtes synchrones (directes)
Exercice : Examen d'un pilote USB host (ligne série)
bullet_jaune_2 Drivers USB device (gadgets)
bullet_jaune_3 pilote de contrôleur USB fonction (bas niveau)
bullet_jaune_3 pilote gadget (haut niveau)
Exercice : Examen d'un pilote gadget simple (zero gadget)