Quelle est la différence entre les modes utilisateur et kernel dans les systèmes d’exploitation?

Quelles sont les différences entre le mode utilisateur et le mode kernel, pourquoi et comment les activer et quels sont leurs cas d’utilisation?

    1. Mode kernel

      En mode kernel, le code d’exécution dispose d’un access complet et illimité au matériel sous-jacent. Il peut exécuter n’importe quelle instruction du processeur et référencer toute adresse mémoire. Le mode kernel est généralement réservé aux fonctions les plus fiables et les plus fiables du système d’exploitation. Les crashs en mode kernel sont catastrophiques; ils vont arrêter le PC entier.

    2. Mode utilisateur

      En mode utilisateur, le code d’exécution n’a pas la possibilité d’accéder directement au matériel ou à 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 accidents 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

    Comprendre le mode utilisateur et le mode kernel

    Ce sont deux modes différents dans lesquels votre ordinateur peut fonctionner. Auparavant, lorsque les ordinateurs ressemblaient à une grande salle, si quelque chose tombait en panne, l’ordinateur s’arrêtait. Donc, les architectes informatiques décident de le changer. Les microprocesseurs modernes implémentent dans le matériel au moins 2 états différents.

    Mode utilisateur:

    • mode où tous les programmes utilisateur sont exécutés. Il n’a pas access à la RAM et au matériel. La raison en est que si tous les programmes s’exécutaient en mode kernel, ils pourraient écraser la mémoire de chacun. S’il doit accéder à l’une de ces fonctionnalités, il appelle l’API sous-jacente. Chaque processus démarré par Windows, à l’exception du processus système, s’exécute en mode utilisateur.

    Mode kernel:

    • mode où tous les programmes du kernel sont exécutés (différents pilotes). Il a access à toutes les ressources et au matériel sous-jacent. Toute instruction de processeur peut être exécutée et chaque adresse de mémoire est accessible. Ce mode est réservé aux pilotes qui opèrent au niveau le plus bas

    Comment le commutateur se produit.

    Le passage du mode utilisateur au mode kernel ne se fait pas automatiquement par le processeur. Le processeur est interrompu par des interruptions (timers, clavier, E / S). En cas d’interruption, le processeur arrête d’exécuter le programme en cours, passe en mode kernel et exécute le gestionnaire d’interruption. Ce gestionnaire enregistre l’état du processeur, effectue ses opérations, restaure l’état et retourne au mode utilisateur.

    http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode

    http://tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html

    http://en.wikipedia.org/wiki/Direct_memory_access

    http://en.wikipedia.org/wiki/Interrupt_request

    Un processeur dans un ordinateur exécutant Windows a deux modes différents: le mode utilisateur et le mode kernel. 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 s’exécutent en mode kernel. Alors que de nombreux pilotes fonctionnent en mode kernel, certains pilotes peuvent fonctionner 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ée. É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 se bloque, le blocage est limité à cette application. Les autres applications et le système d’exploitation ne sont pas affectés par le plantage.

    En plus d’être privé, l’espace d’adressage virtuel d’une application en mode utilisateur est limité. Un processeur fonctionnant 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, voire d’endommager les données critiques du système d’exploitation.

    Tout le code qui s’exécute en mode kernel partage un seul espace d’adressage virtuel. Cela signifie qu’un pilote en mode kernel n’est pas isolé des autres pilotes et du système d’exploitation lui-même. Si un pilote en mode kernel écrit accidentellement sur la mauvaise adresse virtuelle, les données appartenant au système d’exploitation ou à un autre pilote peuvent être compromises. Si un pilote en mode kernel se bloque, tout le système d’exploitation se bloque.

    Si vous êtes un utilisateur Windows une fois que vous passez par ce lien, vous obtiendrez plus.

    Communication entre le mode utilisateur et le mode kernel

    Je vais prendre un coup dans le noir et devinez que vous parlez de Windows. En résumé, le mode kernel a un access complet au matériel, mais pas le mode utilisateur. Par exemple, la plupart des pilotes de périphérique, si ce n’est la plupart, sont écrits en mode kernel car ils doivent contrôler des détails plus précis de leur matériel.

    Voir aussi ce wikibook .

    D’autres réponses expliquaient déjà la différence entre le mode utilisateur et le mode kernel. Si vous voulez vraiment entrer dans les détails, vous devriez obtenir une copie de Windows Internals , un excellent livre écrit par Mark Russinovich et David Solomon décrivant l’architecture et les détails intérieurs des différents systèmes d’exploitation Windows.

    Les anneaux de CPU sont la distinction la plus claire

    En mode x86 protégé, le processeur est toujours dans l’un des 4 anneaux. Le kernel Linux n’utilise que 0 et 3:

    • 0 pour le kernel
    • 3 pour les utilisateurs

    C’est la définition la plus dure et la plus rapide du kernel par rapport à l’utilisateur.

    Pourquoi Linux n’utilise pas les anneaux 1 et 2: CPU Privilege Rings: Pourquoi les anneaux 1 et 2 ne sont-ils pas utilisés?

    Comment l’anneau actuel est-il déterminé?

    L’anneau actuel est sélectionné par une combinaison de:

    • tableau descripteur global: une table en mémoire des 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 descripteurs 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 en cours d’exécution.

    Que peut faire chaque anneau?

    La puce du processeur est construite physiquement pour que:

    • l’anneau 0 peut faire n’importe quoi

    • l’anneau 3 ne peut pas exécuter plusieurs instructions et écrire sur 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 descripteur de segment en cours, qui détermine l’anneau en cours.

      • ne peut pas modifier les tables de pages: comment fonctionne la pagination x86?

        En d’autres termes, impossible de 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 des autres processus pour des raisons de sécurité / facilité de programmation.

      • ne peut pas enregistrer les gestionnaires d’interruption. 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, ne pouvez pas utiliser les instructions LGDT et LIDT.

      • ne peut pas faire des instructions IO comme in et out , et donc avoir des access matériels arbitraires.

        Sinon, par exemple, les permissions de fichiers seraient inutiles si un programme pouvait directement lire à partir du disque.

        Plus précisément grâce à Michael Petch : il est effectivement possible que le système d’exploitation autorise les instructions IO sur le ring 3, ce qui est en fait contrôlé par le segment d’état Task .

        Ce qui n’est pas possible, c’est que la bague 3 se donne la permission de le faire si elle ne l’avait pas au départ.

        Linux l’interdit toujours. Voir aussi: Pourquoi Linux n’utilise-t-il pas le changement de contexte matériel via le TSS?

    Comment les programmes et les systèmes d’exploitation font-ils la transition entre les anneaux?

    • quand le CPU est allumé, il lance le programme initial dans le ring 0 (et bien, mais c’est une bonne approximation). Vous pouvez penser que ce programme initial est le kernel (mais c’est normalement un chargeur de démarrage qui appelle le kernel toujours dans l’anneau 0).

    • Lorsqu’un processus utilisateur souhaite que le kernel fasse quelque chose comme écrire dans un fichier, il utilise une instruction qui génère une interruption telle que int 0x80 pour signaler au kernel.

      Lorsque cela se produit, le processeur appelle et interrompt le gestionnaire de rappel que le kernel a enregistré au démarrage.

      Ce gestionnaire s’exécute dans l’anneau 0, qui décide si le kernel autorisera cette action, effectuera l’action et redémarrera le programme utilisateur dans l’anneau 3.

    • lorsque l’appel système exec est utilisé (ou lorsque le kernel démarre /init ), le kernel prépare les registres et la mémoire du nouveau processus utilisateur, puis passe au point d’entrée et bascule le processeur sur l’anneau 3

    • Si le programme essaie de faire quelque chose de méchant comme écrire dans un registre ou une adresse mémoire interdite (à cause de la pagination), le CPU appelle également un gestionnaire de rappel du kernel dans la sonnerie 0.

      Mais comme l’utilisateur était méchant, le kernel risquait de tuer le processus cette fois-ci ou de lui donner un avertissement avec un signal.

    • Lorsque le kernel démarre, il configure une horloge matérielle avec une fréquence fixe, ce 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 les processus utilisateur à activer.

      De cette manière, 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 du kernel et de l’espace utilisateur présente deux avantages majeurs:

    • il est plus facile de faire des programmes car vous êtes plus certain que l’on n’interférera pas avec l’autre. Par exemple, un processus utilisateur ne doit pas se soucier d’écraser la mémoire d’un autre programme à cause de la pagination, ni de mettre le matériel dans un état invalide pour un autre processus.
    • c’est plus sécurisé. Par exemple, les permissions de fichiers et la séparation de mémoire pourraient empêcher une application de piratage de lire vos données bancaires. Cela suppose, bien sûr, que vous fassiez confiance au kernel.

    Comment jouer avec ça?

    J’ai créé une configuration sans système d’exploitation qui devrait être un bon moyen de manipuler les anneaux directement: https://github.com/cirosantilli/x86-bare-metal-examples

    Je n’ai malheureusement pas eu la patience de faire un exemple d’espace utilisateur, mais je suis allé jusqu’à la configuration de la pagination, donc la zone des utilisateurs devrait être faisable. J’aimerais voir une demande de tirage.

    Alternativement, les modules du kernel Linux s’exécutent dans ring 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 d’un programme? Obtenir une erreur de segmentation

    Voici une configuration pratique de QEMU + Buildroot pour l’essayer sans tuer votre hôte.

    L’inconvénient des modules du kernel 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 reprendre tous les gestionnaires d’interruption avec votre module kernel et posséder le système, ce qui 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 CPU qui ont des capacités supplémentaires par rapport à l’anneau 0 lui-même, et conviennent donc parfaitement au nom de “l’anneau négatif”.

    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

    BRAS

    Dans ARM, les anneaux s’appellent plutôt des niveaux d’exception, mais les idées principales restnt les mêmes.

    Il existe 4 niveaux d’exception dans ARMv8, couramment utilisés comme:

    • EL0: Userland

    • EL1: kernel

    • EL2: hyperviseurs , par exemple Xen .

      Un hyperviseur est un système d’exploitation, un système d’exploitation pour l’utilisateur.

      Par exemple, Xen vous permet d’exécuter plusieurs systèmes d’exploitation tels que Linux ou Windows sur le même système en même temps, et d’isoler les systèmes d’exploitation pour la sécurité et la facilité de débogage, comme 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 toujours utiliser le matériel à 100% et d’économiser beaucoup d’argent.

      AWS, par exemple, a utilisé Xen jusqu’en 2017 lorsque son passage à KVM a fait la une .

    • EL3: encore un autre niveau. Exemple TODO.

    Le modèle de référence de l’architecture ARMv8 DDI 0487C.a – Chapitre D1 – Le modèle de programmeur de niveau système AArch64 – La figure D1-1 illustre cela de manière magnifique:

    entrer la description de l'image ici

    Notez que ARM, peut-être en raison du recul, a une meilleure convention de nommage pour les niveaux de privilèges que x86, sans avoir besoin de niveaux négatifs: 0 étant le plus faible et 3 le plus élevé. Les niveaux supérieurs ont tendance à être créés plus souvent que les niveaux inférieurs.

    Quelle

    Fondamentalement, la différence entre les modes kernel et utilisateur n’est pas dépendante du système d’exploitation et est obtenue uniquement en limitant certaines instructions à exécuter uniquement en mode kernel au moyen de la conception matérielle. Tous les autres objectives, comme la protection de la mémoire, ne peuvent être effectués que par cette ressortingction.

    Comment

    Cela signifie que le processeur vit en mode kernel ou en mode utilisateur. À l’aide de certains mécanismes, l’architecture peut garantir que le code du système d’exploitation soit extrait pour être exécuté en mode kernel.

    Pourquoi

    Ayant cette infrastructure matérielle, celles-ci pourraient être réalisées dans des systèmes d’exploitation communs:

    • Protéger les programmes utilisateur d’accéder à la totalité de la mémoire, ne pas laisser les programmes écraser le système d’exploitation, par exemple,
    • empêcher les programmes utilisateur d’exécuter des instructions sensibles telles que celles qui modifient les limites du pointeur de la mémoire du processeur, pour ne pas laisser les programmes rompre leurs limites de mémoire, par exemple.