Académique Documents
Professionnel Documents
Culture Documents
UAE – ENSAH
12 novembre 2021
5- Noyau Linux et Développement de Pilotes
Plan
1 Noyau Linux
Origine de Linux
Philosophie Unix
Architecture de noyau
Mécanismes du noyau Linux
Gestion des entrées/sorties
Linux et systèmes d’exploitation temps réel
2 Développement de Pilotes
Modules de noyau Linux
Développer pour le noyau
Primitives de synchronisation du noyau
Gestion des interruptions
Dispositifs de caractères
Implémentation du dispositif scull
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
Origines de Linux
Origines de Linux
Origines de Linux
Origines de Linux
– Linus Torvalds
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.1- Origine de Linux
Philosophie Unix
Mais qu’est-ce que la philosophie Unix ?
� Réflexion de Ken Thompson (co-créateur d’Unix) : concevoir un SE petit, mais
capable, avec une interface de service bien conçu et clair
� Unix est bottom-up et non top-down ; c’est une philosophie pragmatique et basée sur
l’expérience
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.2- Philosophie Unix
Philosophie Unix
Mais qu’est-ce que la philosophie Unix ?
� Réflexion de Ken Thompson (co-créateur d’Unix) : concevoir un SE petit, mais
capable, avec une interface de service bien conçu et clair
� Unix est bottom-up et non top-down ; c’est une philosophie pragmatique et basée sur
l’expérience
Selon Doug McIlroy (1978) :
1 Make each program do one thing well. To do a new job, build afresh rather than
complicate old programs by adding new features.
2 Expect the output of every program to become the input to another, as yet unknown,
program. Don’t clutter output with extraneous information. Avoid stringently columnar
or binary input formats. Don’t insist on interactive input.
3 Design and build software, even operating systems, to be tried early, ideally within
weeks. Don’t hesitate to throw away the clumsy parts and rebuild them.
4 Use tools in preference to unskilled help to lighten a programming task, even if you
have to detour to build the tools and expect to throw some of them out after you’ve
finished using them.
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.2- Philosophie Unix
1 Règle de modularité : écrire des parties simples connectées par des interfaces claires
1 Règle de modularité : écrire des parties simples connectées par des interfaces claires
� Logiciel est robuste lorsqu’il performe bien autant dans conditions normales
qu’inattendues
� Plupart des logiciels fragiles, parce que trop compliqués pour être compris par
humains
� Si on ne peut pas comprendre, comment être certain de la rectitude
� Éviter cas particuliers, car bogues proviennent souvent de là
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.2- Philosophie Unix
11 Règle du silence : lorsqu’un programme n’a rien à dire, il ne doit dire rien
� Le silence est d’or : éviter d’attirer inutilement attention des utilisateurs
� Information importante doit être visible, on s’y limite donc
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.2- Philosophie Unix
11 Règle du silence : lorsqu’un programme n’a rien à dire, il ne doit dire rien
� Le silence est d’or : éviter d’attirer inutilement attention des utilisateurs
� Information importante doit être visible, on s’y limite donc
12 Règle de la réparation : réparer si possible, mais si l’on doit échouer le faire aussi
bruyamment et hâtivement que possible
� Adaption aux situations inattendues est souhaitable
� Mais pire sorte de bogues est lorsque réparation échoue et problème créé corruption
apparaissant à rebours
� Donc, permettre logiciel de gérer entrées incorrectes autant que possible, échouer
bruyamment pour rendre diagnostic plus aisé
� Be liberal in what you accept, and conservative in what you send
� Être tolérant sur le format de ce qui est accepté
� Utiliser format fixe et standardisé pour les sorties
� Faire attention à l’audience cible et aux traditions
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.2- Philosophie Unix
13 Règle de l’économie : temps des programmeurs est coûteux, y préférer temps des
machines
� Utiliser des langages de haut niveau autant que possible
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.2- Philosophie Unix
13 Règle de l’économie : temps des programmeurs est coûteux, y préférer temps des
machines
� Utiliser des langages de haut niveau autant que possible
14 Règle de la génération : éviter de bidouiller à la main ; écrire des programmes qui
écrivent des programmes autant que possible
� Humains inaptes à gérer détails, programmes peuvent faire meilleur travail pour tâche
répétitive et/ou complexe
� Code généré souvent (à tous niveaux) plus fiable et supérieur à celui fait par humain
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.2- Philosophie Unix
Tiré de Eric S. Raymond. The art of Unix programming. 2003, CC BY-ND 1.0 http ://www.catb.org/esr/writings/taoup/html/index.html.
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.3- Architecture de noyau
Architecture de noyau
Linux est un noyau monolithique
� Noyau est un seul gros programme s’exécutant en mode privilégié
� Architecture des noyaux Unix traditionnels
� Un seul processus avec espace mémoire partagé
� Communications entre composantes effectuées par appel de fonction
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.3- Architecture de noyau
Architecture de noyau
Linux est un noyau monolithique
� Noyau est un seul gros programme s’exécutant en mode privilégié
� Architecture des noyaux Unix traditionnels
� Un seul processus avec espace mémoire partagé
� Communications entre composantes effectuées par appel de fonction
Micro-noyau
� Fonctionnalités du noyau séparées en processus distincts (serveurs), s’exécutant en
mode usager
� Seules fonctionnalités absolument essentielles s’exécutent en mode privilégié
� Communications par passage de messages
� Espace mémoire distinct pour chaque serveur
� Si un serveur échoue (ex. pilote), noyau reste opérationnel
� Surcoûts non négligeables (passage de messages et changement de mode d’exécution)
Par Wooptoo [domaine public], via Wikimedia Commons, https ://commons.wikimedia.org/wiki/File :OS-structure.svg.
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.3- Architecture de noyau
Caractéristiques du noyau
Caractéristiques de Linux
� Support pour chargement dynamique de modules
� Même si monolithique, code du noyau peut être chargé et déchargé à la demande
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.3- Architecture de noyau
Caractéristiques du noyau
Caractéristiques de Linux
� Support pour chargement dynamique de modules
� Même si monolithique, code du noyau peut être chargé et déchargé à la demande
� Support pour exécution sur architecture multiprocesseur
� Non supporté sur implémentations traditionnelles d’Unix
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.3- Architecture de noyau
Caractéristiques du noyau
Caractéristiques de Linux
� Support pour chargement dynamique de modules
� Même si monolithique, code du noyau peut être chargé et déchargé à la demande
� Support pour exécution sur architecture multiprocesseur
� Non supporté sur implémentations traditionnelles d’Unix
� Noyau préemptif
� Tâches dans le noyau peuvent être préemptées
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.3- Architecture de noyau
Caractéristiques du noyau
Caractéristiques de Linux
� Support pour chargement dynamique de modules
� Même si monolithique, code du noyau peut être chargé et déchargé à la demande
� Support pour exécution sur architecture multiprocesseur
� Non supporté sur implémentations traditionnelles d’Unix
� Noyau préemptif
� Tâches dans le noyau peuvent être préemptées
� Pas de différence entre processus et threads
� Distinction faite seulement par la configuration du partage de mémoire
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.3- Architecture de noyau
Caractéristiques du noyau
Caractéristiques de Linux
� Support pour chargement dynamique de modules
� Même si monolithique, code du noyau peut être chargé et déchargé à la demande
� Support pour exécution sur architecture multiprocesseur
� Non supporté sur implémentations traditionnelles d’Unix
� Noyau préemptif
� Tâches dans le noyau peuvent être préemptées
� Pas de différence entre processus et threads
� Distinction faite seulement par la configuration du partage de mémoire
� Modèle orienté objet de périphériques et de dispositifs
� Connections à chaud et système de fichiers dans l’espace utilisateur
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.3- Architecture de noyau
Caractéristiques du noyau
Caractéristiques de Linux
� Support pour chargement dynamique de modules
� Même si monolithique, code du noyau peut être chargé et déchargé à la demande
� Support pour exécution sur architecture multiprocesseur
� Non supporté sur implémentations traditionnelles d’Unix
� Noyau préemptif
� Tâches dans le noyau peuvent être préemptées
� Pas de différence entre processus et threads
� Distinction faite seulement par la configuration du partage de mémoire
� Modèle orienté objet de périphériques et de dispositifs
� Connections à chaud et système de fichiers dans l’espace utilisateur
� Ignore certaines fonctionnalités Unix considérées comme mal conçues
� Ex. pas de support pour STREAMS, architecture de communications entre noyau et
E/S
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.4- Mécanismes du noyau Linux
Modèle de threading
Trois types de tâches dans Linux
� Processus
� Espace mémoire distinct et exécution en mode usager
� Threads
� Espace mémoire partagé par tous les threads d’un processus
� Kthreads (threads du noyau)
� Pas d’espace mémoire propre, accès à l’espace mémoire du noyau
� Exécution en mode privilégié
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.4- Mécanismes du noyau Linux
Modèle de threading
Trois types de tâches dans Linux
� Processus
� Espace mémoire distinct et exécution en mode usager
� Threads
� Espace mémoire partagé par tous les threads d’un processus
� Kthreads (threads du noyau)
� Pas d’espace mémoire propre, accès à l’espace mémoire du noyau
� Exécution en mode privilégié
Modèle de threading assez unique
� Avec d’autres SE (ex. Windows, Solaris), threads généralement une forme légère de processus (light-
weight process)
� Temps de création de processus/threads sous Linux se compare favorablement aux autres SE
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.4- Mécanismes du noyau Linux
Modèle de threading
Trois types de tâches dans Linux
� Processus
� Espace mémoire distinct et exécution en mode usager
� Threads
� Espace mémoire partagé par tous les threads d’un processus
� Kthreads (threads du noyau)
� Pas d’espace mémoire propre, accès à l’espace mémoire du noyau
� Exécution en mode privilégié
Modèle de threading assez unique
� Avec d’autres SE (ex. Windows, Solaris), threads généralement une forme légère de processus (light-
weight process)
� Temps de création de processus/threads sous Linux se compare favorablement aux autres SE
Kthreads permettent préemption dans le noyau
� Code du noyau est réentrant
� Kthreads peuvent être préemptés tant qu’ils ne détiennent pas un lock
� Fonction schedule() peut être appelée par un kthread pour préemption explicite
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.4- Mécanismes du noyau Linux
Ordonnancement
Ordonnancement dans Linux
� Priorité par processus
� Nice entre -20 (haute priorité) et 19 (basse priorité) pour processus réguliers
� Facteur ≈ 3× pour différence de nice de 5
� Priorité temps réel entre 0 et 99 (nice de 0 correspond à priorité de 120)
� Completely Fair Scheduler (CFS) : quantum variable
� Quantum variable pour chaque exécution de processus
� Juste part calculée selon priorité (nice) du processus
� Valeur du quantum dépend des ressources consommées jusqu’à présent par le processus
relativement à sa juste part
� Processus avec part consommée plus faible sont prioritaires
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.4- Mécanismes du noyau Linux
Ordonnancement
Ordonnancement dans Linux
� Priorité par processus
� Nice entre -20 (haute priorité) et 19 (basse priorité) pour processus réguliers
� Facteur ≈ 3× pour différence de nice de 5
� Priorité temps réel entre 0 et 99 (nice de 0 correspond à priorité de 120)
� Completely Fair Scheduler (CFS) : quantum variable
� Quantum variable pour chaque exécution de processus
� Juste part calculée selon priorité (nice) du processus
� Valeur du quantum dépend des ressources consommées jusqu’à présent par le processus
relativement à sa juste part
� Processus avec part consommée plus faible sont prioritaires
CFS : algorithme d’ordonnancement générique
� Conçu pour fonctionner dans une grande variété de contexte (ex. ordinateur portable,
serveur de calcul, téléphone intelligent)
� Algorithmes d’ordonnancement temps réel également disponibles (présentés semaines
précédentes)
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.4- Mécanismes du noyau Linux
Appels système
Temps et compteurs
Comment le temps est géré par le noyau ?
� Interruptions matérielles de l’horloge reçues à fréquence fixe (100Hz pour x86 et ARM),
correspond à un tic
� Interruptions/tics déclenchent traitements périodiques
� Mettre à jour durée d’opération (uptime) du système
� Équilibrer charge des
les de l’ordonnanceur entre processeurs
� Exécuter compteurs dynamiques dont délais sont expirés
� Mettre à jour statistiques sur utilisation des ressources
� Exécution peut être à chaque tic ou bien à chaque n tics
� Fréquence des tics peut être modifiée par recompilation du noyau
� Variable jiffies : nombre de tics depuis démarrage du système
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.4- Mécanismes du noyau Linux
Temps et compteurs
Comment le temps est géré par le noyau ?
� Interruptions matérielles de l’horloge reçues à fréquence fixe (100Hz pour x86 et ARM),
correspond à un tic
� Interruptions/tics déclenchent traitements périodiques
� Mettre à jour durée d’opération (uptime) du système
� Équilibrer charge des
les de l’ordonnanceur entre processeurs
� Exécuter compteurs dynamiques dont délais sont expirés
� Mettre à jour statistiques sur utilisation des ressources
� Exécution peut être à chaque tic ou bien à chaque n tics
� Fréquence des tics peut être modifiée par recompilation du noyau
� Variable jiffies : nombre de tics depuis démarrage du système
Compteur (timer ) : fonction à exécuter après un certain délai
� Appels de fonction ne sont pas périodiques
� Réinsérer compteur après son exécution si modèle périodique désiré
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.5- Gestion des entrées/sorties
Interruptions matérielles
Interruptions matérielles
� Structure générique interne au noyau pour gérer accès aux dispositifs de blocs
� Requêtes d’accès aux dispositifs de blocs gérées par des files d’attente
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.5- Gestion des entrées/sorties
� Structure générique interne au noyau pour gérer accès aux dispositifs de blocs
� Requêtes d’accès aux dispositifs de blocs gérées par des files d’attente
Ordonnanceur des E/S
� Ordonnanceur distinct pour les E/S à des dispositifs de blocs
� Organise requêtes diverses aux dispositifs de blocs pour maximiser performance
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.5- Gestion des entrées/sorties
Objectif principal de l’ordonnanceur des E/S : réduire temps d’accès pour augmenter
débit global
� Ordonnanceur peut être injuste à certaines requêtes pour améliorer performance globale
� Principales actions : fusion et tri
� Fusionner requêtes à des emplacements consécutifs sur le dispositif
� Trier file des appels pour optimiser le transfert des données
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.5- Gestion des entrées/sorties
Objectif principal de l’ordonnanceur des E/S : réduire temps d’accès pour augmenter
débit global
� Ordonnanceur peut être injuste à certaines requêtes pour améliorer performance globale
� Principales actions : fusion et tri
� Fusionner requêtes à des emplacements consécutifs sur le dispositif
� Trier file des appels pour optimiser le transfert des données
Deadline I/O Scheduler
� Chaque requête à une échéance (500ms pour lectures, 5 s pour écritures)
� Trois files d’attente : file de lecture, file d’écriture et file triée
� File triée fusionne et tri les requêtes
� Requêtes insérées dans file de lecture ou file d’écriture (selon l’opération) et dans file triée
� Si requête en tête de file de lecture ou file d’écriture expire, on l’exécute, sinon exécute
requête en tête de file triée
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.5- Gestion des entrées/sorties
Objectif principal de l’ordonnanceur des E/S : réduire temps d’accès pour augmenter
débit global
� Ordonnanceur peut être injuste à certaines requêtes pour améliorer performance globale
� Principales actions : fusion et tri
� Fusionner requêtes à des emplacements consécutifs sur le dispositif
� Trier file des appels pour optimiser le transfert des données
Deadline I/O Scheduler
� Chaque requête à une échéance (500ms pour lectures, 5 s pour écritures)
� Trois files d’attente : file de lecture, file d’écriture et file triée
� File triée fusionne et tri les requêtes
� Requêtes insérées dans file de lecture ou file d’écriture (selon l’opération) et dans file triée
� Si requête en tête de file de lecture ou file d’écriture expire, on l’exécute, sinon exécute
requête en tête de file triée
Trois autres ordonnanceurs des E/S également présents dans Linux
5- Noyau Linux et Développement de Pilotes
5.1- Noyau Linux
5.1.6- Linux et systèmes d’exploitation temps réel
QNX
QNX
FreeRTOS
FreeRTOS
Fin de Séance
Vos Questions ?