Quelles sont les différences entre le mode utilisateur et le mode noyau, pourquoi et comment les activer, et quels sont leurs cas d'utilisation?
Mode noyau
En mode noyau, le code d'exécution dispose d'un accès complet et illimité au matériel sous-jacent. Il peut exécuter toute instruction de la CPU et référencer toute adresse de mémoire. Le mode noyau est généralement réservé aux fonctions du système d'exploitation les plus fiables et de niveau inférieur. Les accidents en mode noyau sont catastrophiques; ils vont arrêter le PC entier.
Mode utilisateur
En mode utilisateur, le code d'exécution ne permet pas d'accéder directement au matériel ni à la mémoire de référence. Le code exécuté en mode utilisateur doit déléguer aux API système pour accéder au matériel ou à la mémoire. En raison de la protection offerte par ce type d’isolement, les collisions en mode utilisateur sont toujours récupérables. La plupart du code exécuté sur votre ordinateur s'exécutera en mode utilisateur.
Lire la suite
Ce sont deux modes différents dans lesquels votre ordinateur peut fonctionner. Avant cela, lorsque les ordinateurs ressemblaient à une grande pièce, si quelque chose se bloquait, l'ordinateur tout entier était arrêté. Alors les architectes informatiques décident de le changer. Les microprocesseurs modernes implémentent matériellement au moins 2 états différents.
Mode utilisateur:
Mode noyau:
Comment se produit le changement?.
Le passage du mode utilisateur au mode noyau n’est pas effectué automatiquement par la CPU. La CPU est interrompue par des interruptions (minuteries, clavier, E/S). Lorsque l'interruption se produit, la CPU cesse d'exécuter le programme en cours, passe en mode noyau et exécute le gestionnaire d'interruptions. Ce gestionnaire enregistre l'état de la CPU, effectue ses opérations, le restaure et revient en mode utilisateur.
http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode
http://tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html
Un processeur sur un ordinateur Windows utilise deux modes différents: le mode utilisateur et le mode noyau. Le processeur bascule entre les deux modes en fonction du type de code exécuté sur le processeur. Les applications s'exécutent en mode utilisateur et les principaux composants du système d'exploitation en mode noyau. Alors que de nombreux pilotes s'exécutent en mode noyau, certains peuvent s'exécuter en mode utilisateur.
Lorsque vous démarrez une application en mode utilisateur, Windows crée un processus pour l'application. Le processus fournit à l'application un espace d'adressage virtuel privé et une table de descripteurs privés. Étant donné que l'espace d'adressage virtuel d'une application est privé, une application ne peut pas modifier les données appartenant à une autre application. Chaque application s'exécute de manière isolée et si une application tombe en panne, la panne est limitée à cette application. Les autres applications et le système d'exploitation ne sont pas affectés par l'accident.
En plus d'être privé, l'espace d'adressage virtuel d'une application en mode utilisateur est limité. Un processeur en mode utilisateur ne peut pas accéder aux adresses virtuelles réservées au système d'exploitation. La limitation de l'espace d'adressage virtuel d'une application en mode utilisateur empêche l'application de modifier et d'endommager éventuellement les données critiques du système d'exploitation.
Tout le code exécuté en mode noyau partage un seul espace d'adressage virtuel. Cela signifie qu'un pilote en mode noyau n'est pas isolé des autres pilotes et du système d'exploitation lui-même. Si un pilote en mode noyau écrit accidentellement sur la mauvaise adresse virtuelle, les données appartenant au système d'exploitation ou à un autre pilote pourraient être compromises. Si un pilote en mode noyau se bloque, tout le système d'exploitation se bloque.
Si vous utilisez Windows une fois par ce lien, vous en obtiendrez plus.
Je vais tenter ma chance dans le noir et devinez que vous parlez de Windows. En bref, le mode noyau a un accès complet au matériel, mais pas le mode utilisateur. Par exemple, beaucoup, sinon la plupart des pilotes de périphérique sont écrits en mode noyau car ils doivent contrôler des détails plus fins de leur matériel.
Voir aussi this wikibook .
D'autres réponses ont déjà expliqué la différence entre le mode utilisateur et le mode noyau. Si vous voulez vraiment entrer dans les détails, vous devriez vous procurer un exemplaire de Windows Internals , un excellent livre écrit par Mark Russinovich et David Solomon décrivant l'architecture et les détails internes des différents systèmes d'exploitation Windows.
Les anneaux de la CPU sont la distinction la plus claire
En mode protégé x86, la CPU est toujours dans l'une des 4 sonneries. Le noyau Linux utilise uniquement 0 et 3:
C'est la définition la plus dure et la plus rapide du noyau par rapport au pays utilisateur.
Pourquoi Linux n'utilise pas les anneaux 1 et 2: Anneaux de privilège de l'UC: Pourquoi les anneaux 1 et 2 ne sont pas utilisés?
Comment la sonnerie actuelle est-elle déterminée?
La sonnerie actuelle est sélectionnée par une combinaison de:
table de descripteur global: table en mémoire d'entrées GDT, et chaque entrée a un champ Privl
qui code l'anneau.
L'instruction LGDT définit l'adresse sur la table de descripteur actuelle.
Voir aussi: http: //wiki.osdev.org/Global_Descriptor_Table
le segment enregistre CS, DS, etc., qui pointe vers l'index d'une entrée dans le GDT.
Par exemple, CS = 0
_ signifie que la première entrée du GDT est actuellement active pour le code d'exécution.
Que peut faire chaque sonnerie?
La puce du processeur est construite physiquement de sorte que:
la bague 0 peut faire n'importe quoi
l'anneau 3 ne peut pas exécuter plusieurs instructions et écrire dans plusieurs registres, notamment:
ne peut pas changer sa propre bague! Sinon, il pourrait se mettre à sonner 0 et les sonneries seraient inutiles.
En d'autres termes, vous ne pouvez pas modifier le courant descripteur de segment , qui détermine la sonnerie actuelle.
ne peut pas modifier les tables de page: Comment fonctionne la pagination x86?
En d'autres termes, vous ne pouvez pas modifier le registre CR3 et la pagination elle-même empêche la modification des tables de pages.
Cela empêche un processus de voir la mémoire d'autres processus pour des raisons de sécurité/facilité de programmation.
ne peut pas enregistrer les gestionnaires d'interruptions. Ceux-ci sont configurés en écrivant dans des emplacements de mémoire, ce qui est également empêché par la pagination.
Les gestionnaires s'exécutent dans l'anneau 0 et briseraient le modèle de sécurité.
En d'autres termes, vous ne pouvez pas utiliser les instructions LGDT et LIDT.
ne peut pas faire IO des instructions comme in
et out
, et ont ainsi des accès matériels arbitraires.
Autrement, par exemple, les autorisations de fichiers seraient inutiles si un programme pouvait lire directement à partir du disque.
Plus précisément grâce à Michael Petch : il est en fait possible pour le système d'exploitation d'autoriser les instructions IO sur l'anneau 3, ceci est en fait contrôlé par le Segment d'état de la tâche .
Ce qui n’est pas possible, c’est que l’anneau 3 se donne la permission de le faire s’il ne l’avait pas eu en premier lieu.
Linux le refuse toujours. Voir aussi: Pourquoi Linux n'utilise-t-il pas le commutateur de contexte matériel via le TSS?
Comment les programmes et les systèmes d'exploitation effectuent-ils la transition entre les anneaux?
lorsque la CPU est allumée, elle lance le programme initial dans l’anneau 0 (bien, mais c’est une bonne approximation). Vous pouvez penser que ce programme initial est le noyau (mais c'est normalement un chargeur de démarrage qui appelle ensuite le noyau toujours dans l'anneau 0).
lorsqu'un processus utilisateur veut que le noyau fasse quelque chose pour lui, comme écrire dans un fichier, il utilise une instruction qui génère une interruption telle que int 0x80
pour signaler le noyau.
Lorsque cela se produit, la CPU appelle et interrompt le gestionnaire de rappel que le noyau a enregistré au démarrage.
Ce gestionnaire s'exécute dans l'anneau 0, qui décide si le noyau autorise cette action, effectue l'action et redémarre le programme utilisateur dans l'anneau 3.
lorsque l'appel système exec
est utilisé (ou lorsque le noyau démarrera /init
), le noyau prépare les registres et la mémoire du nouveau processus utilisateur, puis saute au point d’entrée et fait basculer la CPU en sonnerie 3
Si le programme essaie de faire quelque chose de méchant comme écrire dans un registre interdit ou une adresse mémoire (à cause de la pagination), la CPU appelle également un gestionnaire de rappel du noyau dans l'anneau 0.
Mais comme l’utilisateur était méchant, le noyau pourrait tuer le processus cette fois-ci ou lui donner un avertissement avec un signal.
Lorsque le noyau démarre, il configure une horloge matérielle avec une fréquence fixe, qui génère des interruptions périodiquement.
Cette horloge matérielle génère des interruptions qui exécutent l'anneau 0 et lui permettent de planifier l'activation des processus utilisateur.
De cette façon, la planification peut se produire même si les processus ne font aucun appel système.
Quel est l'intérêt d'avoir plusieurs anneaux?
La séparation des noyaux et des utilisateurs présente deux avantages majeurs:
Comment jouer avec??
J'ai créé une configuration de métal nu qui devrait être un bon moyen de manipuler les bagues directement: https: //github.com/cirosantilli/x86-bare-metal-examples
Malheureusement, je n’ai pas eu la patience de donner un exemple d’utilisateur, mais j’ai été aussi loin que la configuration de la pagination, l’utilisateur devrait donc être réalisable. J'aimerais voir une demande de traction.
Les modules du noyau Linux s'exécutent également dans l'anneau 0, vous pouvez donc les utiliser pour tester des opérations privilégiées, par exemple. lire les registres de contrôle: Comment accéder aux registres de contrôle cr0, cr2, cr3 à partir d’un programme? Obtenir l'erreur de segmentation
Voici une configuration pratique de QEMU + Buildroot pour l'essayer sans tuer votre hôte.
L'inconvénient des modules de noyau est que d'autres kthreads sont en cours d'exécution et pourraient interférer avec vos expériences. Mais en théorie, vous pouvez prendre en charge tous les gestionnaires d’interruptions avec votre module de noyau et posséder le système, ce serait un projet intéressant.
Anneaux négatifs
Bien que les anneaux négatifs ne soient pas réellement référencés dans le manuel Intel, il existe en réalité des modes de processeur qui ont des capacités supplémentaires par rapport à l’anneau 0 lui-même.
Un exemple est le mode hyperviseur utilisé dans la virtualisation.
Pour plus de détails, voir: https: //security.stackexchange.com/questions/129098/what-is-protection-ring-1
[~ # ~] armer [~ # ~]
Dans ARM, les anneaux sont appelés niveaux d'exception, mais les idées principales restent les mêmes.
Il existe 4 niveaux d'exception dans ARMv8, couramment utilisés en tant que:
EL0: pays utilisateur
EL1: noyau
EL2: hypervisors , par exemple Xen .
Un hyperviseur est un système d’exploitation, ce qu’est un système d’exploitation.
Par exemple, Xen vous permet d'exécuter simultanément plusieurs systèmes d'exploitation, tels que Linux ou Windows, sur le même système. Il isole les systèmes d'exploitation les uns des autres pour des raisons de sécurité et de débogage, comme le fait Linux pour les programmes utilisateur.
Les hyperviseurs sont un élément clé de l'infrastructure cloud actuelle: ils permettent à plusieurs serveurs de fonctionner sur un seul matériel, ce qui permet de maintenir l'utilisation du matériel à près de 100% et d'économiser beaucoup d'argent.
AWS, par exemple, a utilisé Xen jusqu'en 2017 lorsque son transfert vers KVM a fait les nouvelles .
EL3: encore un autre niveau. TODO exemple.
Le Modèle de référence d'architecture ARMv8 DDI 0487C.a - Chapitre D1 - Le modèle de programmeur de niveau système AArch64 - La figure D1-1 illustre bien ce phénomène:
Notez que ARM, peut-être en raison du recul, a une meilleure convention de dénomination pour les niveaux de privilège que x86, sans nécessiter de niveaux négatifs: 0 étant le plus bas et 3 le plus élevé. Les niveaux les plus élevés ont tendance à être créés plus souvent que les niveaux les plus bas.
Le EL actuel peut être interrogé avec l'instruction MRS
: quel est le mode/niveau d'exception actuel, etc.?
ARM n'exige pas que tous les niveaux d'exception soient présents pour permettre des implémentations qui n'ont pas besoin de la fonctionnalité pour enregistrer la zone de puce. ARMv8 "Niveaux d'exception" dit:
Une implémentation peut ne pas inclure tous les niveaux d'exception. Toutes les implémentations doivent inclure EL0 et EL1. EL2 et EL3 sont facultatifs.
Par exemple, QEMU est défini par défaut sur EL1, mais EL2 et EL3 peuvent être activés avec les options de ligne de commande: qemu-system-aarch64 entrant el1 lors de l'émulation de la mise en marche de a53
Quoi
Fondamentalement, la différence entre les modes noyau et utilisateur ne dépend pas du système d'exploitation et est obtenue uniquement en limitant l'exécution de certaines instructions uniquement en mode noyau au moyen d'une conception matérielle. Toutes les autres utilisations, telles que la protection de la mémoire, ne peuvent être effectuées que par cette restriction.
Comment
Cela signifie que le processeur vit en mode noyau ou en mode utilisateur. En utilisant certains mécanismes, l’architecture peut garantir que, lorsqu’il passe au mode noyau, le code du système d’exploitation est extrait pour être exécuté.
Pourquoi
Avec cette infrastructure matérielle, ceux-ci pourraient être réalisés dans des OS communs: