2010-08-28 6 views
0

J'utilise CreateFileMapping et MapViewOfFile pour essayer de mapper un fichier de presque 1 Go. J'avais quelques problèmes avec l'extension du fichier alors j'ai pensé que j'essaierais d'utiliser CreateFileMapping avec une taille de 1 Go. C'est plus grand que le fichier actuel, mais cela fonctionne bien sur les fichiers plus petits.Windows me permet de mapper 1 Go de mémoire virtuelle

Il semble que je peux obtenir presque à un mappage de 1 Go, mais pas tout le chemin. Il s'agit d'environ 16 Mo de moins de 1 Go. J'utilise le programme SysInternals VMMap pour voir la disposition des pièces dans mon programme de test. C'est très étrange pour moi. VMMap me montre qu'il y a de la mémoire virtuelle libre juste après ma carte!

Pourquoi ne puis-je pas l'utiliser?

Il ressemble un peu à ceci:
0x3F6E0000 < - cette pièce est allouée à mon programme de test
0x406E0000 < - cette pièce est libre et près de 800 Mo en taille! Donne le moi!

Y a-t-il de la magie dans cette zone de mémoire par rapport à 0x40000000? Si oui, pourquoi m'a-t-il laissé utiliser 0x6E0000? Par ailleurs, le programme de test utilise MapViewOfFile dans 64 segments individuels, ce qui explique pourquoi la pièce 0x3F6E0000 n'est pas très grande.

+1

Ne nous laissez pas en suspens, que dit la colonne Détails? –

Répondre

1

Ceci est un long shot, mais il se pourrait que quelque chose de petit est mappée près 0x40000000 (peut-être une DLL?), Et que le noyau ne peut pas trouver un espace VA contigu qui est la taille que vous voulez (vous » j'ai assez, mais c'est divisé), ça échoue. Si vous voulez mapper dans des fichiers gigantesques, c'est beaucoup plus facile sur un modern architecture - comme vous obtenez seulement un espace VA garanti de 1,5 Go pour les processus en mode utilisateur sur Windows une fois que vous soustrayez toutes les DLL et tas.

+0

C'est une bonne théorie. Peut-il y avoir des éléments mappés que VMMap.exe ne peut pas afficher? –

+0

Il se peut que ce soit juste trop petit pour apparaître dans le graphique, ou cela pourrait être une autre raison - comme je l'ai mentionné, je théorise surtout ici. –

+0

C'est en fait très probable, les DLL ont souvent une adresse de base de 0x4000000. –

Questions connexes