2010-11-19 23 views
0

Je travaille sur une application Windows 32 bits qui peut parfois manquer de mémoire (les 2 Go d'espace d'adressage virtuel). Quand je regarde comment la mémoire virtuelle est allouée en utilisant WinDbg ou VMMap, je remarque une image dll qui prend 85 Mo d'espace mémoire virtuel. Pour être précis, 84 Mo de ceci est dans la section ".data", et a la protection "Copie sur écriture". Quand je regarde sur le disque dur, cependant, la DLL est seulement 81 KB.Comment une image dll peut-elle être plus de 1000 fois plus grande dans la mémoire virtuelle que l'espace du disque dur?

Comment l'image dll peut-elle être plus de 1000 fois plus grande dans l'espace d'adressage virtuel que sur le disque? Notez que je ne pose que des questions sur l '"Image", pas sur les tas ou les piles, ou la mémoire cartographiée, juste sur l'image - je me rends bien compte que les tas, piles, mémoire mappée, etc.

Répondre

5

Essayez de créer un vide .dll et ajouter ce à périmètre du fichier:

char global_stuff[84*1024*1024]; 

Cela devrait déclarer une entrée dans la section .bss. C'est une section dans l'image qui définit les données initialisées zéro. Puisque ces données sont initialisées à zéro, il est assez simple de simplement déclarer à quel point cela devrait être important au lieu de stocker un tas de zéros sur le disque.

+0

J'ai ajouté global_stuff, exactement comme ci-dessus, mais cela n'a pas affecté la section .data de la DLL. Quand je lance dumpbin sur la DLL, je vois que le .data est 52DB00 (ou 86.880.256 octets en décimal). Cela n'a pas changé quand j'ai ajouté global_stuff. – Sean

+0

@Sean, avez-vous exécuté dumpbin sur le .dll 84k aussi bien? – MSN

+0

J'ai d'abord essayé sur une DLL existante, et je n'ai pas vu de différence. Maintenant que j'essaye une DLL vide, comme vous l'avez suggéré, je vois ce que vous dites. J'accepte ta réponse – Sean