2009-04-28 12 views

Répondre

8

Depends. Le pool Non paginé doit être réservé pour la mémoire qui doit rester dans la mémoire RAM, donc si vous effectuez une opération critique affectée par une page de mémoire à partir d'une opération de disque, utilisez la commande Non paginée.

Voir here pour plus d'informations.

En regardant this (bien qu'il traite de C++ par opposition à C) il semblerait que par défaut les globals peuvent être situés soit par # pragma. Aussi sur p22 de nous voyons comment faire ceci. Enfin this discuss nous voyons ici que le segment de données devrait être non pagagable par défaut.

+0

question No.my est somthing comme si je déclare une variable globale dans le pilote de l'appareil, dont la mémoire sera utilisée, soit paginée mémoire ou la mémoire pool non paginée? (Local variable utilisera la mémoire de réserve non paginée). – Navaneeth

+0

ça ne dépend pas. ce sera un pool paginé ou non-paginé. – Navaneeth

+2

#pragma data_seg ("PAGE") int foo; #pragma data_seg ("NONPAGE") int barre; - foo ici est pageable, et la barre est non paginée. La valeur par défaut est non paginée si vous ne lui donnez pas de pragma. – SecurityMatt

2

Les variables globales d'un pilote en mode noyau sont allouées à partir de NonPagedPool.

Vous pouvez également utiliser l'extension de périphérique (lorsque vous appelez IoCreateDevice), elle est toujours allouée à partir de la mémoire NonPaged.

J'espère que cette aide, Martin

+1

Ce n'est pas vrai. Les pilotes du noyau dans Windows sont des fichiers PE avec plusieurs sections, et contrairement aux programmes en mode utilisateur normal, les pilotes KM ont normalement * deux * sections de données - une qui est paginée et une qui est non paginée (et parfois une troisième le pilote KM a été initialisé). Dans votre code, vous pouvez choisir si votre variable (ou même la fonction) est paginée ou non en utilisant les pragmas alloc. – SecurityMatt

Questions connexes