GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi le noyau est-il mappé sur le même espace d'adressage que les processus ?

Pour répondre à une autre partie de la question - le noyau est mappé dans l'espace d'adressage de chaque processus en partie pour des raisons d'efficacité/performance (il y en a d'autres aussi, j'en suis sûr).

Sur la plupart des matériels modernes, il est plus rapide de changer le niveau de sécurité (permettant ainsi l'accès aux pages qui sont autrement protégées, comme mentionné dans la réponse d'Alexey) afin d'effectuer des appels système et d'autres fonctions fournies par le noyau que de changer le niveau de sécurité et l'ensemble de la carte de mémoire virtuelle, ainsi que tous les vidages de cache TLB associés et tout ce qui est impliqué dans un changement de contexte complet.

Étant donné que les appels système peuvent être des événements assez fréquents, la conception qui a évolué sous Linux et dans de nombreux autres endroits pour essayer de minimiser les frais généraux liés à l'utilisation des services du noyau, et le mappage du code du noyau et (au moins certaines) des données dans chaque processus fait partie de cela.


Un processus "possède" l'ensemble de l'espace d'adressage virtuel ici, le noyau et les parties utilisateur de celui-ci.

Son incapacité à jeter un coup d'œil sur le code et les données du noyau n'est pas due à des espaces d'adressage différents, mais à des droits d'accès/permissions différents définis dans les tables de pages. Les pages du noyau sont configurées de manière à ce que les applications normales ne puissent pas y accéder.

Il est cependant habituel de se référer aux deux parties d'un tout comme l'espace noyau et l'espace utilisateur et cela peut prêter à confusion.


Imaginez ce qui se passerait si le noyau n'était pas mappé dans chaque espace d'adressage de processus. Il s'agirait d'une triple faute car, par exemple, l'interruption du minuteur se produit, puis le processeur appelle la routine ISR à l'aide de l'IDT (Interrupt Descriptor Table). Si le noyau n'est pas mappé, l'adresse IDT devient invalide et ainsi une triple faute en résultera.


Une autre raison importante pour laquelle nous disons que le noyau est dans l'espace d'adressage du processus est que le noyau peut accéder au code utilisateur/aux données du processus ACTUEL, c'est-à-dire l'espace d'adressage virtuel 0 ~ 3G.

Désolé pour mon mauvais anglais. Je ne suis pas de langue maternelle anglaise.


Linux
  1. Linux - Pourquoi n'y a-t-il pas de système de fichiers Rootfs présent sur le système ?

  2. Linux - Pourquoi le noyau ne peut-il pas exécuter Init ?

  3. Exécuter une fonction de l'espace utilisateur à partir de l'espace noyau

  4. Pourquoi pr_debug du noyau Linux ne donne-t-il aucune sortie ?

  5. Pourquoi protéger le noyau Linux de l'utilisateur root ?

Comprendre la prise en charge des adresses virtuelles 52 bits dans le noyau Arm64

Espace d'adressage du processus 32 bits sur Linux 64 bits

Les processus en veille obtiennent-ils le même temps CPU ?

Pourquoi le serveur Linux NFS est-il implémenté dans le noyau plutôt que dans l'espace utilisateur ?

Pourquoi les liens durs semblent-ils occuper le même espace que les originaux ?

Quelle est l'utilité d'avoir une partie noyau dans l'espace de mémoire virtuelle des processus Linux ?