Si j'écris un programme qui essaie de lire la mémoire à chaque adresse possible et que je l'exécute sur un Unix "complet", il ne pourra pas accéder à toute la RAM physique. Mais comment le système d'exploitation l'empêche-t-il de le faire?
Je connais mieux les petites architectures de CPU où n'importe quel morceau de code d'assemblage peut accéder à tout. Je ne comprends pas comment un programme (le noyau) peut détecter de telles opérations malveillantes.
Réponses:
Ce n'est pas le noyau qui empêche les mauvais accès à la mémoire, c'est le CPU. Le rôle du noyau est uniquement de configurer correctement le CPU.
Plus précisément, le composant matériel qui empêche les mauvais accès à la mémoire est le MMU . Lorsqu'un programme accède à une adresse mémoire, l'adresse est décodée par la CPU sur la base du contenu de la MMU. La MMU établit une traduction des adresses virtuelles en adresses physiques: lorsque la CPU effectue un chargement ou un stockage à une certaine adresse virtuelle, elle calcule l'adresse physique correspondante en fonction du contenu de la MMU. Le noyau définit la configuration MMU de telle manière que chaque programme ne peut accéder qu'à la mémoire à laquelle il a droit. La mémoire d'autres programmes et les registres matériels ne sont pas du tout mappés dans la mémoire d'un programme: ces adresses physiques n'ont pas d'adresse virtuelle correspondante dans la configuration MMU de ce programme.
Lors d'un changement de contexte entre différents processus, le noyau modifie la configuration MMU afin qu'il contienne la traduction souhaitée pour le nouveau processus.
Certaines adresses virtuelles ne sont pas du tout mappées, c'est-à-dire que la MMU les traduit en une valeur spéciale «aucune telle adresse». Lorsque le processeur déréférence une adresse non mappée, cela provoque un piège: le processeur se branche sur un emplacement prédéfini dans le code du noyau. Certains pièges sont légitimes; par exemple, l'adresse virtuelle pourrait correspondre à une page qui est dans l' espace de swap , auquel cas le code du noyau chargera le contenu de la page de swap puis reviendra au programme d'origine de telle sorte que l'instruction d'accès à la mémoire soit exécutée à nouveau. Les autres interruptions ne sont pas légitimes, auquel cas le processus reçoit un signal qui, par défaut, tue immédiatement le programme (et sinon, se branche sur le gestionnaire de signaux du programme: dans tous les cas, l'instruction d'accès à la mémoire n'est pas terminée).
la source