Partager via


MmAllocateContiguousMemorySpecifyCacheNode, fonction (ntddk.h)

La routine MmAllocateContiguousMemorySpecifyCacheNode alloue une plage de mémoire physique contiguë et non paginée et la mappe à l’espace d’adressage système.

Syntaxe

PVOID MmAllocateContiguousMemorySpecifyCacheNode(
  [in]           SIZE_T              NumberOfBytes,
  [in]           PHYSICAL_ADDRESS    LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS    HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS    BoundaryAddressMultiple,
  [in]           MEMORY_CACHING_TYPE CacheType,
  [in]           NODE_REQUIREMENT    PreferredNode
);

Paramètres

[in] NumberOfBytes

Taille, en octets, du bloc de mémoire contiguë à allouer. Pour plus d’informations, consultez la section Remarques ci-dessous.

[in] LowestAcceptableAddress

Adresse physique valide la plus basse que l’appelant peut utiliser. Par exemple, si un appareil ne peut traiter que des emplacements au-dessus des 8 premiers mégaoctets de la plage d’adresses mémoire physique du processeur, le pilote de cet appareil doit définir LowestAcceptableAddress sur 0x0000000000800000.

[in] HighestAcceptableAddress

Adresse physique valide la plus élevée que l’appelant peut utiliser. Par exemple, si un appareil ne peut traiter que des emplacements dans les 16 premiers mégaoctets de la plage d’adresses de mémoire physique du processeur, le pilote de cet appareil doit définir HighestAcceptableAddress sur 0x0000000000FFFFFF.

[in, optional] BoundaryAddressMultiple

Adresse physique multiple que la mémoire tampon allouée ne doit pas traverser. Une adresse physique multiple doit toujours être une puissance de deux. Ce paramètre est facultatif et peut être spécifié comme zéro pour indiquer que l’appareil n’a aucune restriction de limite de mémoire spéciale. Pour plus d’informations, consultez Remarques.

[in] CacheType

Spécifie une valeur MEMORY_CACHING_TYPE, qui indique le type de mise en cache demandée pour la mémoire physique contiguë.

[in] PreferredNode

Numéro de nœud préféré. Si un système multiprocesseur contient N nœuds, les nœuds sont numérotés 0 à N-1. Si MM_ANY_NODE_OK est spécifié ou si la machine n’a qu’un seul nœud, l’allocation est satisfaite à partir de n’importe quel nœud. Sinon, l’allocation est effectuée à partir du nœud préféré ou si une plage satisfaisante est introuvable à partir du nœud préféré, NULL est retournée.

Valeur de retour

MmAllocateContiguousMemorySpecifyCacheNode retourne l’adresse virtuelle de base pour la mémoire allouée. Si la requête ne peut pas être satisfaite, la routine retourne NULL .

Remarques

Un pilote de périphérique en mode noyau appelle cette routine pour allouer un bloc contigu de mémoire physique. Dans un système multiprocesseur d’accès à la mémoire non uniforme (NUMA), l’appelant peut spécifier un nœud préféré à partir duquel allouer la mémoire. Un nœud est une collection de processeurs qui partagent un accès rapide à une région de mémoire. Dans un multiprocesseur non NUMA ou un système à processeur unique, MmAllocateContiguousMemorySpecifyCacheNode traite toutes les mémoires comme appartenant à un seul nœud et alloue de la mémoire à partir de ce nœud.

MmAllocateContiguousMemorySpecifyCacheNode alloue un bloc de mémoire non paginée contiguë dans l’espace d’adressage physique. La routine mappe ce bloc à un bloc contigu de mémoire virtuelle dans l’espace d’adressage système et retourne l’adresse virtuelle de la base de ce bloc. La routine aligne l’adresse de départ d’une allocation de mémoire contiguë à une limite de page de mémoire.

Les pilotes ne doivent pas accéder à la mémoire au-delà de la taille d’allocation demandée. Par exemple, les développeurs ne doivent pas supposer que leurs pilotes peuvent utiliser en toute sécurité la mémoire entre la fin de leur allocation demandée et la limite de page suivante.

Étant donné que la mémoire physique contiguë est généralement en courte quantité, elle doit être utilisée avec parcimonie et uniquement si nécessaire. Un pilote qui doit utiliser la mémoire contiguë doit allouer cette mémoire pendant l’initialisation du pilote, car la mémoire physique est susceptible de devenir fragmentée au fil du temps, car le système d’exploitation alloue et libère de la mémoire. En règle générale, un pilote appelle MmAllocateContiguousMemorySpecifyCacheNode de sa routine DriverEntry pour allouer une mémoire tampon interne pour une utilisation à long terme et libère la mémoire tampon juste avant le déchargement du pilote.

La mémoire allouée par MmAllocateContiguousMemorySpecifyCacheNode doit être libérée lorsque la mémoire n’est plus nécessaire. Appelez la routine MmFreeContiguousMemory pour libérer de la mémoire allouée par MmAllocateContiguousMemorySpecifyCacheNode.

Si vous spécifiez une valeur différente de zéro pour le paramètre BoundaryAddressMultiple, la plage d’adresses physique du bloc de mémoire alloué ne franchit pas une limite d’adresse qui est un multiple entier de cette valeur. Un pilote doit définir ce paramètre sur zéro, sauf si une valeur différente de zéro est requise pour contourner une limitation matérielle. Par exemple, si un appareil ne peut pas transférer de données sur des limites physiques de 16 mégaoctets, le pilote doit spécifier une valeur de 0x1000000 pour ce paramètre afin de s’assurer que les adresses que l’appareil voit ne sont pas encapsulables à une limite de 16 mégaoctets.

Si vous utilisez la routine MmAllocateContiguousMemorySpecifyCacheNode routine sur les ordinateurs avec de grandes quantités de mémoire, les performances du système d’exploitation peuvent gravement se dégrader lorsque le système tente de créer un segment contigu de mémoire. Cette dégradation est considérablement réduite à partir de Windows Vista SP1 et Windows Server 2008, mais la mémoire contiguë peut toujours être coûteuse à allouer. Pour cette raison, les pilotes doivent éviter les appels répétés à MmAllocateContiguousMemorySpecifyCacheNode. Au lieu de cela, les pilotes doivent allouer toutes les mémoires tampons contiguës requises dans leurs routines DriverEntry et réutiliser ces mémoires tampons.

Mémoire qui MmAllocateContiguousMemorySpecifyCacheNode alloue est non initialisée. Un pilote en mode noyau doit d’abord zéro cette mémoire s’il va le rendre visible par les logiciels en mode utilisateur (pour éviter la fuite de contenu potentiellement privilégié).

Exigences

Exigence Valeur
client minimum pris en charge Disponible à partir de Windows Vista.
plateforme cible Universel
d’en-tête ntddk.h (include Wdm.h, Ntddk.h)
bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Voir aussi

DriverEntry

MEMORY_CACHING_TYPE

MmFreeContiguousMemory