Comment le noyau empêche-t-il un programme malveillant de lire toute la RAM physique?

10

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.

nowox
la source
2
Habituellement, la MMU veille à ce que vous ne puissiez pas accéder à la mémoire en dehors de vos zones autorisées.
ott--
1
Eh bien, la MMU est configurée par l'assembly. Ainsi, un code d'assemblage peut changer la configuration MMU et accéder à une page mémoire différente, non?
nowox
Cela n'est vrai que si vous exécutez votre code en tant que root.
ott--
2
Vous devriez y lire les tables de pages et l'abstraction du noyau.
Clarus
@ott: même root ne peut pas modifier le MMU (du moins pas sous Linux). Seul le noyau le fait.
Basile Starynkevitch

Réponses:

12

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).

Gilles 'SO- arrête d'être méchant'
la source
Pourriez-vous spécifier un peu la phrase "l'adresse est décodée par le CPU en fonction du contenu de la MMU" ? Existe-t-il un code réel dans le programme en cours qui décode les adresses? Ou lorsqu'un CPU fait un accès à une adresse - l'accès se fait à MMU, qui le traduit / le gère correctement (fait un accès à la mémoire ou au cache et renvoie le résultat, ou déclenche une procédure de noyau)? Du point de vue microcontrôleur / assemblage, la MMU est donc une nouvelle pièce. Le CPU n'est pas connecté directement à la mémoire, il est connecté à MMU et c'est là que l'abstraction de la mémoire virtuelle est effectuée.
xealits
3
@xealits La traduction de l'adresse virtuelle en adresse physique se fait à l'intérieur de la MMU, qui est un circuit matériel. Il n'y a pas de code pour le faire dans le programme ou dans le noyau. Le noyau n'est invoqué que dans des cas exceptionnels, lorsque le programme tente d'accéder à une adresse virtuelle pour laquelle l'entrée MMU indique «adresse non valide». Le noyau fait également le travail de configuration des registres et des tables en RAM que la MMU utilise.
Gilles 'SO- arrête d'être méchant'