PDA

Voir la version complète : Trouver la quantitée reelle de memoire installé avec /maxmem



imported_Bertrand
20/07/2007, 15h33
Salut,

je suis en train d'ecrire une application un peu special qui a besoin de beaucoup de memoire non-paginable; genre 256-512MB.

J'envisage de reduire la memoire vu par WinXP de 256-512MB en utilisant /maxmem dans le boot.ini. Puis de mapper cette memoire dans l'espace d'adressage virtuel du systeme pour m'en servire depuis un driver.

Mais, je voudrais que le driver puisse determiner tout seul la quantitee de memoire non utilisé par WinXP et son adresse.

J'ai vu que CPU-Z reporte toujour la bonne quantitée de memoire installé.
Est-ce que quelqu'un serait comment il fait? Peut-etre Franck@x86 ? :-)

J'ai vu que l'OS utilise le BIOS (int15 e820) mais comme il faut etre en mode reel pour pouvoir l'appeler cela me semble rappé:-(. Est-ce que je me trompe?

Merci pour votre aide,

Bertrand

jihef
20/07/2007, 15h52
Salut,

Qu'enetends-tu par mémoire non-paginable ? Je pencherais pour de la mémoire dont les pages ne peuvent être swappées sur le disque.

Si c est le cas alors il me semble qu on peut allouer des pages de mémoire avec un flag pour empecher ce swap. Je peux rechercher ce flag si c est bien ce que tu veux.

EDIT : Tu peux allouer des pages de mémoire et les vérouiller en RAM (= jamais de swap sur le disque) en utilisant VirtualAlloc et VirtualLock de l APi Win32. Aucun besoin de se réserver de la RAM physique avec maxmem, ni d écrire un driver.

imported_Bertrand
20/07/2007, 16h49
merci pour ton interet.

En fait, j'ai besoin de cette memoire dans un driver.
Je peux soit utiliser ExAllocatePool(NonPagedPool,...) soit AllocateCommonBuffer(...) (qui doit faire la meme chose je pense).

Le probleme c'est que sous WinXP(32bit) la memoire maximum pour le systeme est:
Pool Type 256 MB (128 MB if booted /3GB)
Paged 491.875 MB (Windows 2000 and Windows XP); 650 MB (Windows erver 2003)

Le probleme serait resolu sous WinXP.64 car la on a 128GB d'allouable mais bon c'est pas possible dans mon cas:-)

Si tu as une idee je suis preneur...

jihef
20/07/2007, 18h05
Malheureusement je connais rien à la prog. en mode noyau, donc je ne pense pas pouvoir t'aider :( .

Sinon as-tu essayé de changer la taille du pool mémoire noyau ?


By the way, Paged and Non-Paged Pool Memory sized can be adjusted with the registry keys HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\Memory Management\(Non)PagedPoolSize. The Value specified is the size in bytes.

Ca pourrait être une piste à suivre.

imported_Bertrand
20/07/2007, 21h49
En fait, on arrive a 256MB en modifiant cette clef de registry sinon c'est plutot 128MB (la valeur est choisie par le systeme).
Et on n'a pas le droit de mettre plus de 256MB.

merci pour tes recherches, A+

jihef
20/07/2007, 21h52
Une idée comme ça en passant : faire un mappage de fichier en mémoire. Seulement je sais pas si c'est possible entre mode kernel.