2010-05-12 3 views
1

Je doute de l'accès à certaines données invalides. Comment le système d'exploitation provoquer une erreur de segmentation pour un scénario comme celui-ci:Comment le noyau donne seg. faute pour un scénario comme celui-ci?

Supposons un bloc de données est de 100 octets, aligné au début d'une page 4K. Si nous accédons aux données valides dans les 100 premiers octets de la page, cela chargera la page en mémoire, et mettra l'entrée de table de page dans TLB. Si nous essayons maintenant d'accéder à certaines données invalides entre le 100 et le 4K, puisque l'entrée est déjà dans la table de page, serons-nous autorisés à accéder aux données invalides?

Répondre

5

C'est exact. Mais généralement, vous n'allouez pas de mémoire directement à partir du fonctionnement. Vous l'allouez généralement via une fonction de bibliothèque (new ou malloc, etc.). La fonction de bibliothèque prendra le 4KB (habituellement elle alloue plus de 4KB dans un morceau, aussi) et le divise en morceaux réels que vous demandez. Donc généralement quand vous demandez 100 octets de mémoire, ces 100 octets seront "coincés" entre deux autres demandes d'allocation que vous avez faites.

C'est pourquoi il est « un comportement non défini » lorsque vous accédez à des données de la fin d'un tableau: vous pourrait obtenir une erreur de segmentation, vous pourrait poubelle une autre variable qui arrive à y être stockés, ou vous peut être être OK et cela fonctionne réellement (pendant un certain temps au moins).

2

La page entière appartient à votre programme, donc pas une erreur de segmentation ou de violation d'accès sera généré. Pour cette raison, des outils de débogage de mémoire tels que Electric Fence répondre le cas échéant aux demandes d'allocation d'un bloc de mémoire à la fin d'une page au lieu du début, de sorte que de bogues limites provoquent une erreur de segmentation.

2

Vous pouvez, en effet, être en mesure d'accéder aux données non valides entre les octets 100 et 4 Ko de la page, même si la page n'est pas chargé. Le noyau ne connaît que les accès qui sont faits à une page qui n'existe pas (ou à une page où vous n'avez pas d'autorisation de lecture/écriture). Les emplacements exacts de blocs spécifiques de données sur les pages sont déterminés par la bibliothèque C, et non par le noyau.

Si vous voulez un accès mémoire invalide à l'échec instantanément à des fins de débogage, vous devez utiliser un outil comme valgrind, qui vérifie tous les accès à la mémoire. Ce n'est toujours pas une garantie que vous aurez une erreur signalée. Vous pourriez constater que vous accédez réellement à un morceau de mémoire qui a été alloué à d'autres fins, et dans cette situation, valgrind n'a aucun moyen de savoir que c'est faux.

Questions connexes