Comment le système d'exploitation détecte les violations d'accès à la mémoire


12

Comment un système d'exploitation (de préférence Linux) sait-il que vous avez accédé à un emplacement mémoire auquel vous n'êtes pas autorisé?

Cette question a été inspirée par ces fichus pointeurs! La façon dont je le vois est la suivante: tout dans les ordinateurs concerne un compromis entre la vitesse, la sécurité, l'intégrité et de telles choses.

Je connais bien les cartes mémoire sous Linux, mais cela me semble un peu ridicule que le noyau vérifie si l'emplacement auquel vous essayez d'accéder réside dans une plage valide CHAQUE FOIS que vous effectuez un accès. On dirait que cela perdrait tellement de temps, qui pourrait être consacré à quelque chose de plus productif (mais peut-être moins sûr sans vérification!). Ou peut-être qu'il se souvient de tous les accès récents et les vérifie à chaque tick du minuteur matériel? (Mais cela semble dangereux, et encore une fois, lent.)

J'ai été surpris que cette question semble être sans réponse nulle part. C'est quelque chose que je me suis toujours demandé. Cela me fait penser qu'il existe une section de matériel qui le fera au nom de l'OS, à un niveau d'abstraction agréable et pratique. Mais encore, cela nécessiterait peut-être de charger les cartes de mémoire des processus suivants sur chaque changement de contexte, ce qui semble encore lent.

Alors oui, de toute façon, je continue un peu: comment un système d'exploitation détecte-t-il une violation de mémoire?

Merci

Réponses:


11

(La réponse suivante suppose un ordinateur de bureau, un serveur ou une plate-forme embarquée haut de gamme «moderne» (comme les smartphones, et de plus en plus de systèmes plus petits également). Pour les systèmes x86, moderne signifie 386 et plus. La réponse suivante suppose également un OS «moderne», comme presque tous les Unix, ou Windows depuis 95.)

Cela ne se produit pas dans le système d'exploitation, cela se produit dans le processeur, en particulier dans la MMU ( unité de gestion de la mémoire ) . La MMU prend en charge l'adressage virtuel, les bits qui composent un pointeur n'indiquent pas directement l'emplacement physique des bits en mémoire.

Dans une MMU typique, lorsqu'un pointeur est déréférencé, la MMU décompose les bits en deux groupes: les bits de poids fort constituent le numéro de page et les bits de poids faible constituent l'adresse à l'intérieur de la page. La plupart des ordinateurs de bureau et serveurs utilisent des pages de 4 Ko. La MMU recherche le numéro de page virtuelle dans une table appelée TLB (c'est ce que vous avez appelé les «mappes de mémoire de processus»). Le TLB indique le numéro de la page physique qui correspond à cette page virtuelle. La MMU récupère ensuite les données de la page physique en mémoire.

Si le TLB ne contient pas d'entrée pour ce numéro de page virtuel particulier, la MMU informe le processeur qu'un accès non valide s'est produit; cela s'appelle généralement une exception.

Notez que je n'ai pas mentionné le système d'exploitation jusqu'à présent. C'est parce que toute cette opération est indépendante du système d'exploitation. L'OS entre en jeu car il configure les choses de deux manières:

  • L'OS est responsable de la commutation des tâches. Dans ce cas, comme vous le soupçonniez, il enregistre le TLB actuel et le remplace par le TLB enregistré pour la prochaine tâche planifiée. De cette façon, chaque processus a un TLB, donc l'adresse 0x123456dans le processus X peut ne pas pointer vers le même endroit réel dans la RAM que cette même adresse dans le processus Y, ou peut simplement être invalide. Si un processus essaie de déréférencer un pointeur en dehors de son espace d'adressage, il n'atteint pas l'espace d'un autre processus, il n'atteint nulle part .

  • L'OS décide de ce qui se passe lorsqu'une exception est levée. Il peut mettre fin au processus pour effectuer un accès mémoire invalide (défaut de segmentation, défaut général de protection, ...). C'est également la façon dont la permutation est implémentée: le gestionnaire d'exceptions peut décider de récupérer certaines données de l'espace de permutation, mettre à jour le TLB en conséquence et effectuer à nouveau l'accès.

Notez que la MMU assure la sécurité car le processus ne peut pas modifier son propre TLB. Seul le noyau du système d'exploitation peut modifier les TLB. Le fonctionnement des autorisations de modification TLB dépasse le cadre de cette réponse.


6

1) Les Segfaults sont détectés par l'unité de gestion de la mémoire. Lorsque vous demandez de la mémoire, le système d'exploitation demande à l'unité de gestion de la mémoire d'en obtenir du matériel. Il doit y avoir quelque chose qui garde la trace de tous les gros blocs de mémoire que le système d'exploitation vous donne. L'OS remet ce genre à la MMU. Puisqu'il connaît toute la mémoire qu'il vous a donnée, il peut également vous dire lorsque vous essayez d'accéder à un emplacement de mémoire que vous n'avez pas obtenu des allocations.Le système d'exploitation a spécifiquement un événement pour cela, la mémoire que vous ne possédez pas. Finalement, le système d'exploitation tue votre application, déclenchant soit une erreur de segmentation ou l'équivalent sur d'autres systèmes d'exploitation.

Tous les systèmes d'exploitation n'ont pas cette protection. MacOS jusqu'à 9 n'avait rien de tout cela, même si la MMU le supportait. Win 3.1 non plus. Win95 avait une certaine protection, car il faisait la transition entre l'absence de protection et l'ajout de certaines.

2) L'OS ne connaît pas d'autres détails que celui-ci. Si vous avez un pointeur errant qui accède à la mémoire que vous n'avez jamais allouée, il le sait. Si vous en avez un qui va dans une autre partie de votre demande, il ne le sait bien sûr pas. Cela vous permet de corrompre cela. C'est là que vous obtenez des piles corrompues, les pointeurs errants de votre application écrasant les autres parties de votre application.

Donc, oui, vous pouvez visser vos propres données. Si vous avez un pointeur errant qui écrase votre propre application, vous espérez que vous frappez votre pile, car cela entraînera probablement une autre violation lorsque vous essayez de retourner la pile, mais si vous frappez vos propres données, vous ne le saurez jamais.

Vous pouvez essayer d'être plus strict que «aucune protection», il existe un outil appelé Electric Fence ( http://perens.com/FreeSoftware/ElectricFence/ ) qui incitera votre MMU à fonctionner un peu plus et à le faire détecter plus défauts.


D'accord, pouvez-vous être plus précis sur son fonctionnement? Par exemple, comment sait-il qu'un processus particulier ne peut pas accéder à un emplacement particulier? Qu'est-ce qui lui indique quels processus peuvent accéder à où? Comment se distingue-t-il? Merci
Doddy

1
@panic - recherchez Memory_management_unit dans wikipedia et les liens de cette page. Notez que l'état du processus inclut le statut MMU. Vous pouvez passer des semestres sur la conception, les fonctionnalités et l'intégration de MMU.
mpez0
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.