Partager via


Fonction MmAllocateContiguousNodeMemory (wdm.h)

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

Syntaxe

PVOID MmAllocateContiguousNodeMemory(
  [in]           SIZE_T           NumberOfBytes,
  [in]           PHYSICAL_ADDRESS LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
  [in]           ULONG            Protect,
  [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 Notes.

[in] LowestAcceptableAddress

Adresse physique valide la plus basse que l’appelant peut utiliser. Par exemple, si un appareil peut traiter uniquement 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 peut traiter uniquement des emplacements dans les 16 premiers mégaoctets de la plage d’adresses 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 croiser. Un multiple d’adresse physique 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 pas de restrictions de limites de mémoire spéciales. Pour plus d'informations, consultez la section Notes.

[in] Protect

Indicateurs de bits qui spécifient la protection à utiliser pour la mémoire allouée. L’appelant doit définir un des bits d’indicateur suivants (mais pas les deux) dans le paramètre Protect .

Bit d’indicateur Signification
PAGE_READWRITE Allouez de la mémoire en lecture/écriture, sans exécution (NX). La plupart des appelants doivent définir ce bit d’indicateur. Pour plus d'informations, consultez la section Notes.
PAGE_EXECUTE_READWRITE Allouez de la mémoire en lecture/écriture exécutable. Ce bit d’indicateur doit être défini uniquement si l’appelant a besoin de la possibilité d’exécuter des instructions dans la mémoire allouée.

En outre, l’appelant peut définir un des bits d’indicateur facultatifs suivants (mais pas les deux) dans le paramètre Protect .

Bit d’indicateur Signification
PAGE_NOCACHE Allouez de la mémoire non mise en cache. Ce bit d’indicateur est similaire à l’appel de MmAllocateContiguousMemorySpecifyCache avec CacheType défini sur MmNonCached.
PAGE_WRITECOMBINE Allouez de la mémoire combinée en écriture. Ce bit d’indicateur est similaire à l’appel de MmAllocateContiguousMemorySpecifyCache avec CacheType défini sur MmWriteCombined.

Si ni PAGE_NOCACHE ni PAGE_WRITECOMBINE n’est spécifié, la mémoire allouée est entièrement mise en cache. Dans ce cas, l’effet est similaire à l’appel de MmAllocateContiguousMemorySpecifyCache avec CacheType défini sur MmCached.

[in] PreferredNode

Numéro de nœud par défaut. Si un système multiprocesseur contient N nœuds, les nœuds sont numérotés de 0 à N-1. Si l’appelant définit PreferredNode sur MM_ANY_NODE_OK, la routine choisit le nœud à partir duquel allouer de la mémoire. Sinon, si la mémoire de la plage d’adresses spécifiée ne peut pas être allouée à partir du nœud préféré, la routine retourne NULL.

Valeur retournée

MmAllocateContiguousNodeMemory retourne l’adresse virtuelle de base pour la mémoire allouée. Si la demande 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. Le pilote appelant peut spécifier s’il faut utiliser la mémoire sans exécution (NX) pour l’allocation. Dans un système multiprocesseur d’accès 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 système multiprocesseur non NUMA ou monoprocesseur, MmAllocateContiguousNodeMemory traite toute la mémoire comme appartenant à un seul nœud et alloue de la mémoire à partir de ce nœud.

MmAllocateContiguousNodeMemory 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ë sur une limite de page 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 la mémoire en toute sécurité entre la fin de leur allocation demandée et la limite de la page suivante.

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

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

MmAllocateContiguousNodeMemory est similaire à la routine MmAllocateContiguousMemorySpecifyCacheNode . Contrairement à MmAllocateContiguousMemorySpecifyCacheNode, MmAllocateContiguousNodeMemory peut être utilisé pour allouer de la mémoire sans exécution (NX). En guise de bonne pratique, un pilote doit allouer de la mémoire NX, sauf si le pilote nécessite explicitement la possibilité d’exécuter des instructions dans la mémoire allouée. En allouant de la mémoire NX, un pilote améliore la sécurité en empêchant les logiciels malveillants d’exécuter des instructions dans cette mémoire. La mémoire allouée par les routines MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCache et MmAllocateContiguousMemorySpecifyCacheNode est toujours exécutable.

Si vous spécifiez une valeur différente de zéro pour le paramètre BoundaryAddressMultiple , la plage d’adresses physiques 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 des données au-delà 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.

La mémoire allouée par MmAllocateContiguousNodeMemory est non initialisée. Un pilote en mode noyau doit d’abord zéro cette mémoire s’il veut la rendre visible pour les logiciels en mode utilisateur (afin d’éviter la fuite de contenu potentiellement privilégié).

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible à partir de Windows 8.
Plateforme cible Universal
En-tête wdm.h (inclure Wdm.h, Ntddk.h)
Bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

Voir aussi

DriverEntry

MmAllocateContiguousMemory

MmAllocateContiguousMemorySpecifyCache

MmAllocateContiguousMemorySpecifyCacheNode

MmFreeContiguousMemory