|
|
|
|
| 1er jour |
| Présentation & Architecture |
 |
Historique |
 |
Licences GPL et open source |
 |
Distributions et versions de Linux |
 |
Architecture du kernel Linux |
| Programmation Linux Noyau |
 |
Outils de développement |
|
 |
outils de compilation |
|
 |
sources de documentation |
|
 |
makefile |
|
 |
Développement des modules noyaux |
|
 |
différences entre applications utilisateur et noyau |
|
 |
écriture d'un module noyau (licence, paramètres, exportation de symboles) |
|
 |
chargement et gestion des versions des modules noyau |
| Exercice : |
Ecriture d'un module simple |
|
 |
La structure objet du noyau Linux |
|
 |
kobject, kset, subsystems |
| Exercice : |
Fabrication d'un objet noyau |
|
 |
lien avec le système de fichiers sysfs |
| Exercice : |
Modification dynamique des attributs et appel de méthodes de l'objet à travers sysfs |
|
 |
La modélisation des périphériques Linux (2.6) |
|
 |
Linux Device Model |
|
 |
Le hotplug |
|
 |
Debug noyau |
|
 |
traces dans le code noyau (printk) |
|
 |
messages Oops! |
|
 |
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 |
|
 |
Allocation mémoire |
|
 |
algorithme d’allocation mémoire buddy et slab/slob/slub |
|
 |
allocations bloquantes ou "atomiques" |
|
 |
limitations de l'allocation dynamique et intérêt de l'allocation statique au boot |
|
 |
Boot des drivers |
|
 |
zones mémoire d’allocations des drivers |
|
 |
allocation dynamique et au boot |
| 2ème jour |
| Multi-tâches Noyau |
 |
Gestion des tâches |
|
 |
task struct |
|
 |
pile noyau et détermination de la tâche courante (macro "current") |
|
 |
quotas d'utilisation des ressources (temps CPU, occupation mémoire, fichiers ouverts...) |
|
 |
Programmation concurrente |
|
 |
quand et comment masquer la préemption |
|
 |
spinlocks (simples et "lecture/écriture") |
|
 |
seqlocks (nouveaux en 2.6) |
|
 |
sémaphores |
|
 |
RCU (nouveaux en 2.6) |
| Exercice : |
Protection des méthodes d'un objet noyau contre une exécution parallèle |
|
 |
Timers |
|
 |
jiffies |
|
 |
timers haute résolution |
|
 |
Envoi de signaux |
| Exercice : |
Mise en évidence des problèmes possibles à l'aide de timers |
| Introduction aux drivers Linux |
 |
Intégration d'un pilote dans les sources de Linux |
|
 |
fichiers Makefile du noyau |
|
 |
fichiers Kconfig (description de l'interface de configuration du noyau) |
|
 |
Concepts des pilotes Linux |
|
 |
Pilote en mode utilisateur/pilote en mode noyau |
|
 |
numéros majeur/mineur et devnums (nouveau en 2.6). Fichiers spéciaux |
|
 |
installation d'un pilote |
|
 |
structures associées aux pilotes (struct inode, struct file, file descriptor) |
|
 |
Transferts de mémoire entre espace noyau et espace utilisateur |
| Exercice : |
Ecriture du code d'initialisation d'un pilote |
| Pilotes caractère |
 |
Ouverture/fermeture |
|
 |
Restriction à une seul ouverture/un seul utilisateur |
|
 |
différence entre "close" et "release" |
| Exercice : |
Ecriture du code d'initialisation d'un driver logiciel |
|
 |
Transferts de mémoire entre espace noyau et espace utilisateur |
|
 |
différences entre adresses virtuelles, logiques, physiques et bus |
|
 |
espaces d'adressage des processus. Swap et pagination |
|
 |
fonctions de copie entre espaces |
|
 |
fonctionnement en "zéro copie" grâce au mapping d'adresses utilisateur dans le noyau |
|
 |
Lecture et écriture |
|
 |
fonctions de base (read/write) |
|
 |
lecture/écriture combinées (readv/writev) |
|
 |
fonctions asynchrones en mode synchrone (aio_read/aio_write) |
| Exercice : |
Ecriture des routines de lecture-écriture d'un pilote logiciel (version sans synchronisation) |
|
 |
Contrôle des périphériques |
|
 |
fonction ioctl |
|
 |
choix des codes de commandes |
| Exercice : |
Modification des paramètres du périphérique à travers un IOCTL |