Pour un système d'exploitation 32 bits, la taille de son espace d'adressage (également appelé espace d'adressage virtuel ou espace d'adressage linéaire) est de 4G (c'est-à-dire 2 à la puissance 32). Cela signifie qu'un processus peut avoir un espace d'adressage maximum de 4G.
Le cœur du système d'exploitation est le noyau, qui est séparé des applications ordinaires et a l'autorisation d'accéder à l'espace mémoire protégé et aux périphériques matériels sous-jacents. Afin de garantir la sécurité du noyau, les systèmes d'exploitation modernes empêchent généralement les processus utilisateur d'exploiter directement le noyau.
Généralement, cela est réalisé en divisant l'espace d'adressage virtuel en deux parties, l'espace noyau et l'espace utilisateur. En ce qui concerne le système d'exploitation Linux, les 1 Go d'octets les plus élevés (de l'adresse virtuelle 0xC0000000 à 0xFFFFFFFF) sont utilisés par le noyau et sont appelés espace noyau. Les octets inférieurs de 3 Go (de l'adresse virtuelle 0x00000000 à 0xBFFFFFFF) sont utilisés par des processus individuels et sont appelés espace utilisateur.
En d'autres termes, de l'espace d'adressage 4G de chaque processus, le 1G le plus élevé est le même, qui est l'espace du noyau. Seule la 3G restante constitue l’espace disponible pour le processus lui-même.
Cela peut être compris comme ceci : "L'espace noyau maximum de 1G est partagé entre tous les processus !" La figure suivante montre l'allocation de l'espace d'adressage 4G pour chaque processus (les images proviennent d'Internet) :
Parmi toutes les instructions du CPU, certaines sont très dangereuses et feront planter le système si elles sont mal utilisées, comme effacer la mémoire, régler l'horloge, etc. Si tous les programmes sont autorisés à utiliser ces instructions, la probabilité d'un crash du système sera considérablement augmentée.
Ainsi, le processeur divise les instructions en instructions privilégiées et instructions non privilégiées. Pour ces instructions dangereuses, seuls le système d'exploitation et ses modules associés sont autorisés à les utiliser, et les applications ordinaires ne peuvent utiliser que les instructions qui ne provoqueront pas de désastre.
Par exemple, le processeur Intel divise les niveaux de privilèges en 4 niveaux : Ring0~Ring3. En fait, les systèmes Linux n'utilisent que deux niveaux d'exécution, Ring0 et Ring3 (il en va de même pour les systèmes Windows).
Lorsqu'un processus s'exécute au niveau Ring3, il est dit qu'il s'exécute en mode utilisateur, tandis que lorsqu'il s'exécute au niveau Ring0, il est dit qu'il s'exécute en mode noyau.
D'accord, nous devons maintenant expliquer ce que sont le mode noyau et le mode utilisateur : "Quand un processus s'exécute dans l'espace noyau, il est en mode noyau, et lorsqu'un processus s'exécute dans l'espace utilisateur, il est en mode utilisateur." En mode noyau, le processus s'exécute dans l'espace d'adressage du noyau et le processeur peut exécuter n'importe quelle instruction à ce moment-là. Le code en cours d'exécution n'est soumis à aucune restriction et peut accéder librement à toute adresse valide ou accéder directement au port.
En mode utilisateur, le processus s'exécute dans l'espace d'adressage utilisateur, et le code exécuté est soumis à de nombreuses vérifications par le CPU. Ils ne peuvent accéder qu'à l'adresse virtuelle de la page accessible en mode utilisateur spécifiée dans l'entrée de la table des pages mappant son adresse. espace et ne peut accéder directement qu'aux ports accessibles spécifiés dans le bitmap d'autorisation d'E/S dans le segment d'état de tâche (TSS).
Pour le système d'exploitation DOS précédent, il n'y avait aucune notion d'espace noyau, d'espace utilisateur, d'état du noyau et d'état utilisateur. On peut considérer que tout le code s'exécute en mode noyau, de sorte que le code d'application écrit par l'utilisateur peut facilement faire planter le système d'exploitation.
Pour Linux, la conception permettant de distinguer l'espace noyau et l'espace utilisateur isole le code du système d'exploitation (le code du système d'exploitation est beaucoup plus robuste que le code d'application) et le code d'application.
Même si une erreur se produit dans une seule application, cela n'affectera pas la stabilité du système d'exploitation, afin que les autres programmes puissent toujours fonctionner normalement (Linux est un système multitâche !).
"Ainsi, faire la distinction entre l'espace noyau et l'espace utilisateur vise essentiellement à améliorer la stabilité et la convivialité du système d'exploitation." En fait, toute la gestion des ressources système est effectuée dans l'espace du noyau. Par exemple, lire et écrire des fichiers disque, allouer et recycler de la mémoire, lire et écrire des données à partir d'interfaces réseau, etc. Notre application ne peut pas effectuer directement de telles opérations. Mais nous pouvons accomplir de telles tâches grâce à l'interface fournie par le noyau. Par exemple, si une application souhaite lire un fichier sur le disque, elle peut lancer un « appel système » au noyau et dire au noyau : « Je veux lire un certain fichier sur le disque ». En fait, une instruction spéciale est utilisée pour permettre au processus d'entrer dans l'état du noyau (vers l'espace du noyau) à partir de l'état utilisateur. Dans l'espace du noyau, le CPU peut exécuter n'importe quelle instruction, y compris la lecture des données du disque. Le processus spécifique consiste d'abord à lire les données dans l'espace noyau, puis à copier les données dans l'espace utilisateur et à passer du mode noyau au mode utilisateur. À ce stade, l'application est revenue de l'appel système et a obtenu les données souhaitées, et peut continuer son exécution avec plaisir. Pour faire simple, l'application sous-traite les tâches de haute technologie (lecture de fichiers à partir du disque) au noyau système, et le noyau système effectue ces tâches de manière professionnelle et efficace. Pour un processus, le processus d'entrée dans l'espace noyau depuis l'espace utilisateur et enfin de retour à l'espace utilisateur est très compliqué. Par exemple, le concept « pile » avec lequel on entre souvent en contact possède en réalité une pile en mode noyau et en mode utilisateur. Lors de son exécution dans l'espace utilisateur, le processus utilise la pile dans l'espace utilisateur, et lors de son exécution dans l'espace noyau, le processus utilise la pile dans l'espace noyau. Par conséquent, chaque processus sous Linux possède deux piles, une pour le mode utilisateur et une pour le mode noyau. La figure suivante décrit brièvement la conversion entre le mode utilisateur et le mode noyau : Étant donné que les processus en mode utilisateur doivent passer en mode noyau pour pouvoir utiliser les ressources système, examinons de combien de manières un processus peut passer du mode utilisateur au mode noyau. En résumé, il existe trois manières : Ensuite, examinons la structure de l'ensemble du système Linux du point de vue de l'espace noyau et de l'espace utilisateur. Il peut être grossièrement divisé en trois parties, de bas en haut : matériel -> espace noyau -> espace utilisateur. Comme le montre l'image ci-dessous (cette image provient d'Internet) : En plus du matériel, le code dans l'espace du noyau contrôle l'utilisation des ressources matérielles. Le code dans l'espace utilisateur ne peut utiliser les ressources matérielles du système que via l'interface d'appel système (System Call Interface) exposée par le noyau. . En fait, non seulement Linux, mais aussi la conception des systèmes d'exploitation Windows sont similaires. En fait, nous pouvons résumer l'activité de chaque processeur à un moment donné comme l'un des trois suivants : Les trois points ci-dessus incluent presque toutes les situations. Par exemple, lorsque le processeur est inactif, le noyau exécute un processus vide, qui est dans le contexte du processus mais s'exécute dans l'espace du noyau. Remarque : les routines de service d'interruption des systèmes Linux ne sont pas exécutées dans le contexte du processus. Elles sont exécutées dans un contexte d'interruption dédié, indépendant de tous les processus. La raison pour laquelle il existe un environnement d'exécution spécial est de garantir que le programme de service d'interruption peut répondre et gérer la demande d'interruption dès que possible, puis se terminer rapidement. La plupart des systèmes d'exploitation modernes protègent la sécurité et la stabilité du système d'exploitation lui-même grâce à la conception de l'espace noyau et de l'espace utilisateur. Par conséquent, lorsque nous lisons des informations sur les systèmes d'exploitation, nous rencontrons souvent des concepts tels que l'espace noyau, l'espace utilisateur, le mode noyau et le mode utilisateur. J'espère que cet article pourra vous aider à comprendre ces concepts de base. Comment accéder à l'espace noyau depuis l'espace utilisateur
系统调用、软中断和硬件中断
. Chacune de ces trois méthodes implique beaucoup de connaissances sur le système d’exploitation, je ne m’étendrai donc pas ici. Structure globale
Résumé
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!