pourquoi le kernel a besoin d’un adressage virtuel?

Dans Linux, chaque processus a son espace d’adressage virtuel (par exemple, 4 Go dans le cas d’un système 32 bits, 3 Go étant réservé au traitement et 1 Go au kernel). Ce mécanisme d’adressage virtuel permet d’isoler l’espace adresse de chaque processus. Ceci est compréhensible en cas de processus car il existe de nombreux processus. Mais comme nous avons seulement 1 kernel, pourquoi avons-nous besoin d’un adressage virtuel pour le kernel?

La raison pour laquelle le kernel est “virtuel” n’est pas de gérer la pagination en tant que telle, mais bien parce que le processeur ne peut s’exécuter que dans un mode à la fois. Donc, une fois que vous activez le mappage de mémoire paginée (bit 31 dans CR0 sur x86), le processeur s’attend à ce que TOUS les access à la mémoire passent par le mécanisme de mappage de page. Donc, comme nous voulons accéder au kernel même après avoir activé la pagination (mémoire virtuelle), il doit exister quelque part dans l’espace virtuel.

La “réservation” de la mémoire concerne davantage “un moyen simple de déterminer si une adresse est un kernel ou un espace utilisateur” que toute autre chose. Il serait parfaitement possible de mettre un peu de kernel à l’adresse 12345-34121, un autre kernel à 101900-102400 et un autre kernel à 40000000-40001000. Mais cela rendrait la vie difficile pour tous les aspects du kernel et de l’espace utilisateur – il y aurait des lacunes / des trous à traiter [il y a déjà de tels trous / gapes, mais en avoir plus ne serait pas vraiment utile]. En définissant une limite fixe pour “L’espace utilisateur est ici d’ici, le kernel va de la fin de l’espace utilisateur à X”, cela rend la vie beaucoup plus facile à cet égard. On peut juste dire kernel = 0; if (address > max_userspace) kernel=1; kernel = 0; if (address > max_userspace) kernel=1; dans un code.

Bien sûr, le kernel ne prend que le maximum de mémoire physique qu’il utilisera – donc l’idée courante selon laquelle “il est inutile de prendre un gigaoctet entier pour le kernel” est erronée – le kernel lui-même en contient quelques-uns (une douzaine ou plus). donc pour un très “gros” kernel) mégaoctets. Les modules chargés peuvent facilement append plusieurs mégaoctets supplémentaires, et les pilotes graphiques d’ATI et nVidia facilement quelques mégaoctets supplémentaires uniquement pour le moduel du kernel. Le kernel utilise également quelques bits de mémoire pour stocker les “données du kernel”, telles que les tâches, les files d’attente, les sémaphores, les fichiers et autres “éléments” auxquels le kernel doit faire face. Quelques mégaoctets sont également utilisés pour cela.

La gestion de la mémoire virtuelle est la fonctionnalité de Linux qui permet le multitâche dans le système sans aucune limitation sur no. de tâche ou quantité de mémoire utilisée par chaque tâche. Le sous-système du gestionnaire de mémoire Linux (avec le matériel MMU) facilite la prise en charge de VMM, où la mémoire ou les périphériques mappés sont accessibles via des adresses virtuelles. Sous Linux, tout, à la fois les composants kernel et utilisateur, fonctionne avec l’adresse virtuelle, sauf s’il s’agit de matériel réel. C’est à ce moment que le gestionnaire de mémoire prend sa place, effectue la traduction d’adresses virtuelles vers physiques et pointe vers l’emplacement physique / mémoire physique.

Un processus est une entité abstraite, définie par le kernel auquel les ressources système sont allouées pour exécuter un programme. Dans Linux Process Management, le kernel fait partie intégrante d’une carte mémoire de processus. Un processus a deux régions principales, comme deux faces d’une pièce:

  • Affichage de l’espace utilisateur – contient les sections du programme utilisateur (code, données, stack, tas, etc.) utilisées par le processus.
  • Vue de l’espace kernel – contient les structures de données du kernel qui conservent les informations (états PID, états, FD, utilisation des ressources, etc.) concernant le processus.

    entrer la description de l'image ici

Chaque processus dans un système Linux possède une région d’espace utilisateur unique et distincte. Cette fonctionnalité de Linux VMM isole chacune des sections du programme de processus. Mais tous les processus du système partagent la région commune de l’espace kernel. Lorsqu’un processus nécessite un service du kernel, il doit exécuter le code du kernel dans cette région ou, en d’autres termes, le kernel fonctionne pour le compte de la demande du processus utilisateur.