Mode utilisateur vs mode noyau : instructions et protection

Un CPU dispose d’un mode utilisateur, où s’exécutent les applications, et d’un mode noyau (mode privilégié), où s’exécute le noyau du système d’exploitation. En mode utilisateur, les instructions privilégiées comme la configuration des tables de pages, les opérations d’entrée-sortie ou le masquage des interruptions ne peuvent pas être exécutées, et seule la mémoire du processus est accessible. Pour lire ou écrire un fichier, par exemple, l’application demande l’aide du noyau par un appel système. On évite ainsi que les défaillances ou la malveillance d’une application n’atteignent les autres processus, le système d’exploitation ou le matériel.

CritèreMode utilisateurMode noyau
Programmes exécutésApplicationsNoyau du système d’exploitation et la plupart des pilotes de périphériques
Instructions exécutablesInstructions ordinaires seulement. Exécuter une instruction privilégiée provoque une exceptionToutes les instructions : changement de tables de pages, activation et masquage des interruptions, configuration des registres de contrôle, etc.
Mémoire accessibleUniquement les pages de l’espace d’adressage virtuel du processus autorisées pour l’utilisateurTout, y compris la zone du noyau. Peut aussi accéder à la mémoire physique et aux registres des périphériques
Commande des périphériquesPas directement. Passe par un appel système au noyauLit et écrit directement les registres et traite les interruptions
Noms selon l’architecture (exemples)Anneau 3 en x86, EL0 en Arm, mode U en RISC-VAnneau 0 en x86, EL1 en Arm, mode S en RISC-V
Déclencheurs du changement de modeEntrée en mode noyau par les instructions d’appel système (syscall, svc, ecall, etc.), les interruptions des périphériques ou des temporisateurs et les exceptions (défaut de page, division par 0, instruction illégale, etc.)Retour en mode utilisateur par une instruction de retour dédiée (sret, eret, etc.) qui rétablit simultanément l’adresse de retour et le mode
Coût de la bascule (ordre de grandeur)Un aller-retour d’appel système coûte en gros de 100 ns à 1 µs. Peut augmenter avec les mesures contre les vulnérabilitésLes traitements internes au noyau passent par des appels de fonction, sans changement de mode. Un changement de processus (changement de contexte) est encore plus lourd
Effet d’une défaillanceSeul le processus concerné est arrêté de forceTout le système peut s’arrêter (panique du noyau, etc.)

Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.

Quand choisir l'un ou l'autre ?

Mode utilisateur
Traitements ordinaires des applications et des bibliothèques. Les calculs et les accès mémoire s’effectuent rapidement en mode utilisateur, sans passer par le noyau.
Mode noyau
Traitements qui exigent la gestion et la protection des ressources : entrées-sorties de fichiers et de réseau, allocation mémoire, changement de processus, traitement des interruptions.
Optimisations
Pour réduire le nombre d’appels système, on accumule les données dans un tampon de l’espace utilisateur et on les écrit en une fois, ou l’on effectue une partie des traitements en mode utilisateur grâce à de la mémoire partagée ou à des mécanismes dédiés.

Questions fréquentes

Pourquoi séparer mode utilisateur et mode noyau ?

Pour empêcher les applications de manipuler à leur guise les tables de pages ou les périphériques. Grâce à cette séparation, un programme défaillant ne peut ni corrompre la mémoire des autres processus ou du système d’exploitation ni prendre le contrôle des périphériques, et il suffit d’arrêter ce programme.

Quand passe-t-on du mode utilisateur au mode noyau ?

Il y a trois déclencheurs : l’appel système, demandé par le programme lui-même ; l’interruption, venant d’un périphérique ou d’un temporisateur ; et l’exception, provoquée par l’exécution d’une instruction, comme un défaut de page ou une division par 0. Dans tous les cas, le CPU change de mode et commence le traitement à un point d’entrée défini du noyau.

Pourquoi les appels système sont-ils lents ?

Outre le changement de mode, il faut sauvegarder et restaurer les registres, vérifier les arguments et effectuer des traitements à l’entrée et à la sortie du noyau. Lorsque les tables de pages sont aussi changées pour parer aux vulnérabilités, c’est encore plus lourd. Un appel est court, mais en faire un à chaque petite lecture ou écriture devient une charge importante.

Changement de mode et changement de contexte, est-ce la même chose ?

Non. Le changement de mode lors d’un appel système fait seulement entrer le même processus dans le traitement du noyau. Le changement de contexte remplace le processus ou le thread en cours d’exécution et implique aussi, entre autres, le changement d’espace d’adressage : c’est une opération plus lourde.

Vérifier vos connaissances

Quel est le but principal de la distinction, dans le CPU, entre mode privilégié (mode noyau) et mode utilisateur ?

  1. APermettre d’exécuter les instructions des applications plus vite et en priorité par rapport à celles du noyau
  2. BEmpêcher les applications de manipuler arbitrairement les tables de pages et les périphériques
  3. CPermettre à un CPU d’exécuter deux instructions simultanément
Afficher la réponse et l'explication

Réponse : B. Empêcher les applications de manipuler arbitrairement les tables de pages et les périphériques

Si les applications pouvaient librement modifier les tables de pages, manipuler les périphériques d’entrée/sortie ou désactiver les interruptions, elles pourraient corrompre la mémoire d’autres programmes ou bloquer tout le système. Le CPU n’autorise donc ces instructions qu’en mode privilégié, réservé au noyau de l’OS. Toute tentative de les exécuter en mode utilisateur provoque une exception. Ce n’est pas un mécanisme de vitesse ni d’exécution simultanée.

Comment s’appelle le mécanisme par lequel une application demande à l’OS d’effectuer par exemple une lecture ou une écriture de fichier ?

  1. AAppel système
  2. BChangement de contexte
  3. CPagination à la demande
Afficher la réponse et l'explication

Réponse : A. Appel système

Les applications s’exécutant en mode utilisateur, elles ne peuvent pas manipuler directement les disques ou les périphériques. Elles utilisent donc un appel système : une instruction dédiée bascule en mode privilégié et invoque le noyau pour demander la lecture ou l’écriture de fichiers, l’allocation de mémoire, la création de processus, etc. À la fin du traitement, le CPU revient en mode utilisateur. Le changement de contexte consiste à changer de processus en exécution, la pagination à la demande à charger une page au moment où elle devient nécessaire.

Quelle est l’explication générale de la différence entre interruption et exception ?

  1. AL’interruption est provoquée uniquement par le logiciel, l’exception uniquement par les circuits matériels
  2. BL’interruption est due à une cause externe comme un périphérique, l’exception résulte de l’exécution d’une instruction
  3. CAprès une interruption, on ne peut pas revenir au traitement initial, alors qu’après une exception on y revient toujours
Afficher la réponse et l'explication

Réponse : B. L’interruption est due à une cause externe comme un périphérique, l’exception résulte de l’exécution d’une instruction

L’interruption est due à une cause externe sans rapport avec l’instruction en cours, comme une notification de fin d’entrée/sortie ou un timer, et survient à un moment imprévisible (asynchrone). L’exception résulte de l’exécution d’une instruction particulière, comme une division par zéro, une instruction illégale, un défaut de page ou une instruction d’appel système (synchrone). Dans les deux cas, on revient souvent au traitement initial après le gestionnaire ; ce n’est pas la possibilité de retour qui les distingue.

  1. Que se passe-t-il lorsque l’instruction ecall à la fin du code RISC-V ci-dessus est exécutée ?
  2. Pour revenir au programme initial après le traitement d’une interruption ou d’une exception, pourquoi utiliser une instruction de retour dédiée (sret, mret, etc. en RISC-V) plutôt que l’instruction de retour de fonction ordinaire ?
  3. Pour écrire de petites données octet par octet, pourquoi est-il plus rapide de les accumuler dans un tampon en espace utilisateur et de les écrire en bloc plutôt que d’invoquer un appel système à chaque fois ?

Questions d'entraînement sur Système d'exploitation et matériel

Termes clés expliqués

Mode privilégié
Mode de fonctionnement du CPU réservé au noyau de l'OS. Il permet d'exécuter des instructions sensibles comme la configuration des tables de pages ou les entrées-sorties, et se distingue du mode utilisateur où tournent les applications.
Appel système
Mécanisme par lequel une application demande à l'OS des services comme la lecture-écriture de fichiers ou l'allocation mémoire. Une instruction dédiée déclenche une exception, fait passer en mode privilégié et appelle le traitement du noyau.
Gestionnaire d'interruption
Routine exécutée par le CPU lorsqu'une interruption ou une exception survient. Elle sauvegarde l'état du traitement interrompu, effectue le traitement selon la cause, puis reprend le traitement initial. En principe, elle doit être aussi courte que possible.
Table des pages
Table qui associe les numéros de page des adresses virtuelles aux numéros de page des adresses physiques. L'OS en crée une par processus et la MMU du CPU la consulte pour traduire les adresses. Chaque entrée contient aussi des bits de protection.
Changement de contexte
Bascule du processus ou du thread exécuté par le CPU. L'état (registres, compteur ordinal, etc.) est sauvegardé et restauré ; lors d'un changement de processus, l'espace d'adressage est aussi changé.

Comparatifs associés