Procédure pour associer des carte RAM dans l'espace d'adressage de processus

Traductions disponibles Traductions disponibles
Numéro d'article: 189327 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Lorsque vous mappez une grande quantité de mémoire de la carte, un des symptômes suivants peut s'afficher :
  • Indisponibilité du système NO_MORE_SYSTEM_PTES (PTE).
  • Pas assez espace d'adressage du processus contigus.
Cet article explique :
  • Pourquoi ces problèmes se produisent
  • Comment faire pour contourner les
  • deux méthodes pour mapper une carte mémoire dans un espace d'adressage processus

Plus d'informations

Présentation des entrées en table des pages (PTE)

Chaque processus qui s'exécute sur un système Windows NT a une adresse virtuelle de 4 Go comprise entre 0 x 00000000 et 0xFFFFFFFF pour son utilisation. De ce, l'adresse de 2 Go supérieur allant 0x8000000 à 0xFFFFFFFF est commune à tous les processus en cours d'exécution dans le système et elle est appelée espace d'adressage du noyau ou système. La région inférieure allant de 0 x 00000000 à 0x7FFFFFFF est appelée espace d'adressage utilisateur.

Du point de vue du processus, chaque élément d'adresse virtuelle conceptuellement fait référence à un octet de mémoire physique. Il incombe de gestionnaire de mémoire virtuelle (VMM) conjointement avec processeur unité de gestion de la mémoire (MMU) pour traduire ou mapper chaque adresse virtuelle en une adresse physique correspondante. Le VMM effectue le mappage en divisant la RAM en cadres de page de taille fixe, création de tables de page pour stocker des informations sur ces cadres de page et en les mappant. Chaque PTE représente un cadre de page et contient des informations nécessaires pour le Gestionnaire de mémoire virtuelle de localiser une page.

Sur un système x 86 qui utilise une taille de page de 4 Ko, le nombre maximal de PTE requis pour mapper 2 Go d'espace d'adressage est 524,288 (2 Go/4 Ko). Sur un système standard, cet espace est utilisé comme suit :
  • Un maximum de 50 000 PTE (environ 195 Mo adresse espace) sont réservées pour un usage général.
  • Le reste est utilisé pour mapper le cache du système, l'hyper-espace, pool paginé, non paginée, zone de vidage sur incident et ainsi de suite.
Cette taille de pool PTE est automatiquement déterminée au démarrage du système en fonction de la quantité de mémoire physique dans le système. Cette réserve est insérée entre la réserve paginée et la réserve non paginée, ce qui augmente également avec la quantité de mémoire physique dans le système également.

Le système utilise ces PTE pour créer des piles de threads du noyau, charger les pilotes (et leurs DLL) pour mapper l'espace d'adressage virtuel de système pour transferts d'e/S ou des appelants de MmMapIoSpace/MmMapLockedPages/MmGetSystemAddressForMdl/MmAllocateNonCachedMemory et à d'autres fins divers. Cette réserve de PTE système peut devenir fortement utilisé et fortement fragmenté. Cela signifie que votre pilote peut ne pas être en mesure d'obtenir suffisamment d'espace adresse virtuelle contigu à partir du pool PTE système à tout moment, même si le total espace toujours restant dans ledit d'adressage peut être assez grande.

Cela signifie également que si votre pilote utilise le système réserve de PTE entièrement, autres parties du système seront dégradent, même de thread non créé, blocages du système et les vérifications de bogue à titre définitif (parce que certains pilotes appellent allouer-mémoire système avec le paramètre MustSucceed défini).

Vous devez être extrêmement prudent lorsque vous utilisez cette carte uniquement par le pool. Utilisez les parties de la carte RAM que vous avez vraiment besoin système accéder à partir de n'importe quel contexte de processus et mappent uniquement le montant que vous avez besoin. Ne mappez pas la plage de la carte entière si vous n'avez pas vraiment besoin pour y accéder à partir de mode du système.

IMPORTANT : unmap la mémoire dès que vous aurez terminé dans le contexte de processus approprié. Dans le cas contraire, le système doit exécuter de PTE et il va de bogue à cocher. Vous pouvez augmenter le nombre de défaut de calculé PTE basée sur la mémoire système totale jusqu'à une valeur maximale en ajoutant un numéro (égale au nombre de pages peut être augmentée) au Registre dans :
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
   \Memory Management\SystemPages
				
vous pouvez également analyser actuellement disponibles "système entrées libres en table des pages" à l'aide de l'Analyseur de performances.

Remarque : les pages de mémoire de carte ne sont pas utilisés pour le remplacement de page. Ils restent mappés dans espace d'adressage du processus même si le processus est inactif ou entièrement permutées out.

Suivantes constituent les deux méthodes plus courantes mapper la carte mémoire. La première méthode mappe la mémoire directement dans utilisateur-espace du processus et la seconde méthode mappe dans espace du processus système et éventuellement dans l'espace utilisateur. Ces deux méthodes nécessitent la mémoire physique être contiguës. En raison de la limitation de PTE vous ne peut-être pas pouvoir mapper une grande quantité de mémoire dans l'espace du système. Toutefois, il est possible de mapper dans l'espace utilisateur s'il se n'agit pas fragmenté ou épuisé.

Méthode d'objet de section

Il existe un échantillon (MAPMEM) dans le DDK de Windows NT 4.0 (accessible à partir de l'appartenance MSDN Professional) qui montre comment effectuer ce mappage. Voici une description de la technique :

  1. Obtenir l'adresse traduite physique de la carte mémoire (HalTranslateBusAddress).
  2. Ouvrir un handle de section (ZwOpenSection) vers le \Device\PhysicalMemory de dispositif de mémoire physique.
  3. Le handle d'objet (ObReferenceObjectByHandle) pour empêcher son en cours de suppression de référence.
  4. Mapper la mémoire (ZwMapViewOfSection).
L'adresse virtuelle que vous obtenir à partir de la ZwMapViewOfSection est uniquement valide dans le contexte du processus, qu'il est mappé. Si vous souhaitez accéder à la mémoire dans l'appel de procédure différés de votre pilote (DPC) ou interrompre la routine du service (ISR), qui s'exécute dans un contexte de processus arbitraires, vous devez également mapper la mémoire dans l'espace d'adressage système (utilisez la méthode suivante). Annuler le mappage (ZwUnMapViewOfSection) la mémoire dans le même processus contexte mappé avant qu'il s'arrête.

Remarque : en général, il peut être dangereux utiliser le ZwMapViewOfSection à l'aide de \Device\PhysicalMemory, sauf si vous possédez déjà les pages physiques. Un pilote qui mappe les pages que ne lui appartient pas presque toujours entraîne la corruption de la mémoire car le propriétaire peut changer les attributs de page, libérez les pages et effectuer d'autres modifications. Lecteurs doit être mappé uniquement la mémoire qu'ils possèdent. En outre, il est strictement interdit de mapper une adresse physique simultanément avec deux attributs différents (c'est-à-dire, mis en cache vs vs noncached writecombined). Cette opération entraîne la corruption de processeur TLB et des résultats imprévisibles.

Sur Windows XP, la fonction ZwMapViewOfSection renvoie erreur STATUS_CONFLICTING_ADDRESSES si pilotes essayez de mapper la même adresse physique en même temps que des attributs conflictuels.

Méthode MmMapIoSpace

Cette méthode montre comment mapper la mémoire dans l'espace d'adressage du processus système et dans l'espace d'adressage du processus utilisateur.
  1. Obtenir l'adresse traduite physique de la carte mémoire (HalTranslateBusAddress).
  2. Mapper la mémoire dans l'espace d'adressage système non paginée comme suit :
          SystemVirtualAddress = MmMapIoSpace(PhysicalAddress, SizeofMemory,
             CacheEnable);
    					
  3. Allouer un MDL :
          Mdl = IoAllocateMdl(SystemVirtualAddress, SizeOfMemory, FALSE, FALSE,
             NULL);
  4. Générer la MDL pour décrire les pages de mémoire :
          MmBuildMdlForNonPagedPool(Mdl);
  5. Mapper la mémoire dans le processus de l'espace de l'utilisateur à l'aide de MmMapLockedPages. Étant donné qu'il existe une incohérence dans la valeur de retour de cette fonction entre les versions pré-SP4 et postérieurs au Service Pack 4 de Windows NT, utilisez l'instruction suivante pour rendre ce code compatible avec toutes les versions de Windows NT :
          UserVirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(Mdl,
             Mode))) + MmGetMdlByteOffset(Mdl));
    					
Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
199311Information : MmMapLockedPages renvoient réel adresse virtuelle dans le Service Pack 4
L'avantage de cette méthode est que vous obtenez SystemVirtualAddress, qui peut être utilisé dans n'importe quel contexte de processus (comme les DPC et ISR) et un UserVirtualAddress peut être utilisé par l'application en mode utilisateur dans le contexte duquel il est mappé.

Si vous mappez dans l'espace d'adressage système, vous devez démapper comme suit :
MmUnmapIoSpace(SystemVirtualAddress, SizeofMemory);
				
si vous mappez dans l'espace d'adressage utilisateur, vous devez démapper comme suit uniquement lors de l'exécution dans le contexte du processus dans lequel vous avez mappé la mémoire :
MmUnmapLockedPages(UserVirtualAddress, Mdl); 

Finally, free the MDL by calling:

IoFreeMdl(Mdl);
				

Références

Pour plus d'informations, consultez la documentation DDK de Windows NT 4.0, ou «Inside Windows NT» par Helen Custer (Microsoft Press 1993).

Propriétés

Numéro d'article: 189327 - Dernière mise à jour: lundi 7 mars 2005 - Version: 1.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Win32 Device Driver Kit for Windows NT 4.0
Mots-clés : 
kbmt kbhowto kbkmode KB189327 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 189327
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Exclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com