Fonction MmAllocateContiguousMemorySpecifyCache (ntddk.h)
La routine MmAllocateContiguousMemorySpecifyCache alloue une plage de mémoire physique contiguë et non paginée et la mappe à l’espace d’adressage système.
Syntaxe
PVOID MmAllocateContiguousMemorySpecifyCache(
[in] SIZE_T NumberOfBytes,
[in] PHYSICAL_ADDRESS LowestAcceptableAddress,
[in] PHYSICAL_ADDRESS HighestAcceptableAddress,
[in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
[in] MEMORY_CACHING_TYPE CacheType
);
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] CacheType
Spécifie une valeur MEMORY_CACHING_TYPE , qui indique le type de mise en cache autorisé pour la mémoire demandée.
Valeur retournée
MmAllocateContiguousMemorySpecifyCache retourne l’adresse virtuelle de base pour la mémoire allouée. Si le système ne parvient pas à allouer la mémoire tampon demandée, la routine retourne NULL.
Remarques
MmAllocateContiguousMemorySpecifyCache 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 MmAllocateContiguousMemorySpecifyCache à 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 MmAllocateContiguousMemorySpecifyCache 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 MmAllocateContiguousMemorySpecifyCache.
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.
Si vous utilisez la routine MmAllocateContiguousMemorySpecifyCache sur des ordinateurs avec de grandes quantités de mémoire, les performances du système d’exploitation peuvent se dégrader considérablement lorsque le système tente de créer un bloc 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 à MmAllocateContiguousMemorySpecifyCache. 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.
La mémoire allouée par MmAllocateContiguousMemorySpecifyCache 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 2000. |
Plateforme cible | Universal |
En-tête | ntddk.h (include Wdm.h, Ntddk.h) |
Bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |