View the site in Français View the site in English (USA) Site displayed in English (GB)
You are here: ac6 > ac6-formation > Linux > Linux drivers

D3 Linux drivers

Writing Linux drivers

Objectifs
bullet_jaune_1 Maîtriser les outils kernel de développement et de mise au point
bullet_jaune_1 Découvrir la gestion du multi-core dans le noyau Linux
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
bullet_jaune_1 Maîtriser les techniques de debugging noyau avec les sondes jtag Lauterbach.
Les exercices se font sur des cartes cibles :
    Carte "SnowBall" de ST-Ericsson, basée sur un ARM Cortex/A9 double cœur, avec sonde JTAG Lauterbach.
    Carte à base de processeur ARM9 d'Atmel, avec sonde JTAG Lauterbach.
Nous utilisons le dernier noyau disponible sur www.kernel.org
Matériel
bullet_jaune_2 Un PC Linux par binôme
bullet_jaune_2 Une carte cible par binôme
bullet_jaune_2 Une sonde jtag Lauterbach 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 noyau 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 : Réalisation d'un système simple de génération sélective dynamique de traces noyau
bullet_jaune_2 Présentation des structures objets du noyau Linux
bullet_jaune_3 kobject, kset
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 : Mise en oeuvre de la sonde jtag Lauterbach
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 Multi-tâche, Multi-coeur et Hyperthreading
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
3ème jour
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
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
4ème jour
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 Problèmes spécifique aux Multi-coaurs (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 affetation d'interruptions à des processeurs
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
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 requêtes synchrones (directes)
Exercice : Examen d'un pilote USB host