2010-11-08 4 views
4

Dans Windows, la pile est implémentée comme suit: une page spécifiée est suivie des pages de pile validées. C'est le drapeau de protection est aussi surveillé. Ainsi, lorsque le chef fait référence à une adresse sur la page guared, une erreur de mémoire augmente, ce qui fait que le gestionnaire de mémoire transfère la page gardée à la pile et nettoie le drapeau protégé de la page, puis réserve une nouvelle page gardée.Allouer un tampon de plus d'une taille de page sur la pile va corrompre la mémoire?

lorsque j'attribue un tampon dont la taille est supérieure à une page (4 Ko), une erreur attendue ne s'est toutefois pas produite. Pourquoi?

Répondre

6

Excellente question (+1).

Il y a un truc, et peu de gens le savent (en dehors des auteurs de pilotes).

Lorsque vous allouez un grand tampon sur la pile - le compilateur ajoute automatiquement ce que l'on appelle des piles de sondes. C'est un code supplémentaire (généralement implémenté dans CRT), qui sonde la région allouée, page par page, dans l'ordre requis.

EDIT:

La fonction est _chkstk.

+0

Où puis-je voir ce code? – sharptooth

+0

documenté ici: http://msdn.microsoft.com/en-us/library/ms648426%28VS.85%29.aspx – valdo

+0

Voir aussi chkstk.asm dans le code source CRT (pour MSVC) – valdo

0

L'erreur n'atteint pas votre programme - elle est gérée par le système d'exploitation. Une chose similaire se produit lorsque votre programme essaie de lire la mémoire qui est écrite dans le fichier d'échange - un trap se produit et le système d'exploitation détecte la page et votre programme continue.

+0

Presque correct. C'est ce qui se passe lorsque vous accédez séquentiellement à la pile et que vous franchissez la limite de page suivante. Cependant, dans le scénario décrit, lorsque vous allouez de grandes variables sur la pile, un tour supplémentaire est nécessaire. – valdo

Questions connexes