Partager via


MmAllocateContiguousMemory, fonction (ntddk.h)

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

Syntaxe

PVOID MmAllocateContiguousMemory(
  [in] SIZE_T           NumberOfBytes,
  [in] PHYSICAL_ADDRESS HighestAcceptableAddress
);

Paramètres

[in] NumberOfBytes

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

[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.

Valeur de retour

MmAllocateContiguousMemory 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

MmAllocateContiguousMemory alloue un bloc de mémoire non paginé 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 MmAllocateContiguousMemory 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 MmAllocateContiguousMemory 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 MmAllocateContiguousMemory.

Lorsque la mémoire physique est fragmentée sur un ordinateur disposant d’une grande quantité de RAM, les appels à MmAllocateContiguousMemory, qui nécessitent que le système d’exploitation recherche des blocs de mémoire contigus, puisse dégrader gravement les performances. 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 à MmAllocateContiguousMemory. 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 MmAllocateContiguousMemory alloue est non initialisée. Un pilote en mode noyau doit d’abord définir cette mémoire sur zéro 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 2000.
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

AllocateCommonBuffer

DriverEntry

MmAllocateContiguousMemorySpecifyCache

MmAllocateNonCachedMemory

MmFreeContiguousMemory