Condividi tramite


Funzione MmAllocateContiguousNodeMemory (ntddk.h)

La routine MmAllocateContiguousNodeMemory alloca un intervallo di memoria fisica contigua, non impaginata e la esegue il mapping allo spazio indirizzi del sistema.

Sintassi

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
);

Parametri

[in] NumberOfBytes

Dimensioni, in byte, del blocco di memoria contigua da allocare. Per altre informazioni, vedere la sezione Osservazioni.

[in] LowestAcceptableAddress

L'indirizzo fisico più basso valido che il chiamante può usare. Ad esempio, se un dispositivo può affrontare solo posizioni superiori ai primi 8 megabyte dell'intervallo di indirizzi di memoria fisica del processore, il driver per questo dispositivo deve impostare LowestAcceptableAddress su 0x0000000000800000.

[in] HighestAcceptableAddress

L'indirizzo fisico più valido che il chiamante può usare. Ad esempio, se un dispositivo può indirizzare solo posizioni nei primi 16 megabyte dell'intervallo di indirizzi di memoria fisica del processore, il driver per questo dispositivo deve impostare HighestAcceptableAddress su 0x0000000000FFFFFF.

[in, optional] BoundaryAddressMultiple

Indirizzo fisico multiplo che il buffer allocato non deve attraversare. Un indirizzo fisico multiplo deve sempre essere una potenza di due. Questo parametro è facoltativo e può essere specificato come zero per indicare che il dispositivo non ha restrizioni di limiti di memoria speciali. Per altre informazioni, vedere la sezione Osservazioni.

[in] Protect

Flag bit che specificano la protezione da usare per la memoria allocata. Il chiamante deve impostare uno (ma non entrambi) dei bit di flag seguenti nel parametro Protect .

Flag bit Significato
PAGE_READWRITE Allocare memoria di lettura/scrittura senza esecuzione (NX). La maggior parte dei chiamanti deve impostare questo bit di flag. Per altre informazioni, vedere la sezione Osservazioni.
PAGE_EXECUTE_READWRITE Allocare memoria di lettura/scrittura eseguibile. Questo bit di flag deve essere impostato solo se il chiamante richiede la possibilità di eseguire istruzioni nella memoria allocata.

Inoltre, il chiamante può impostare uno (ma non entrambi) dei seguenti bit di flag facoltativi nel parametro Protect .

Flag bit Significato
PAGE_NOCACHE Allocare memoria non memorizzata nella cache. Questo bit di flag è simile alla chiamata a MmAllocateContiguousMemorySpecifyCache con CacheType impostata su MmNonCached.
PAGE_WRITECOMBINE Allocare memoria combinata di scrittura. Questo bit di flag è simile alla chiamata a MmAllocateContiguousMemorySpecifyCache con CacheTypeimpostata su MmWriteCombined.

Se non viene specificato né PAGE_NOCACHE né PAGE_WRITECOMBINE, la memoria allocata viene memorizzata nella cache completa. In questo caso, l'effetto è simile alla chiamata di MmAllocateContiguousMemorySpecifyCache con CacheType impostato su MmCached.

[in] PreferredNode

Numero di nodo preferito. Se un sistema multiprocessore contiene nodi N, i nodi vengono numerati da 0 a N-1. Se il chiamante imposta PreferredNode su MM_ANY_NODE_OK, la routine sceglie il nodo da cui allocare la memoria. In caso contrario, se la memoria nell'intervallo di indirizzi specificato non può essere allocata dal nodo preferito, la routine restituisce NULL.

Valore restituito

MmAllocateContiguousNodeMemory restituisce l'indirizzo virtuale di base per la memoria allocata. Se la richiesta non può essere soddisfatta, la routine restituisce NULL.

Commenti

Un driver di dispositivo in modalità kernel chiama questa routine per allocare un blocco contiguo di memoria fisica. Il driver chiamante può specificare se usare la memoria senza esecuzione (NX) per l'allocazione. In un sistema multiprocessore (NUMA) non uniforme, il chiamante può specificare un nodo preferito da cui allocare la memoria. Un nodo è una raccolta di processori che condividono l'accesso rapido a un'area di memoria. In un multiprocessore non NUMA o in un sistema a processore singolo, MmAllocateContiguousNodeMemory considera tutta la memoria come appartenente a un singolo nodo e alloca la memoria da questo nodo.

MmAllocateContiguousNodeMemory alloca un blocco di memoria non impaginato contiguo nello spazio indirizzi fisico. La routine esegue il mapping di questo blocco a un blocco contiguo di memoria virtuale nello spazio indirizzi di sistema e restituisce l'indirizzo virtuale della base di questo blocco. La routine allinea l'indirizzo iniziale di un'allocazione di memoria contigua a un limite di pagina di memoria.

I driver non devono accedere alla memoria oltre le dimensioni di allocazione richieste. Ad esempio, gli sviluppatori non devono presupporre che i driver possano usare in modo sicuro la memoria tra la fine dell'allocazione richiesta e il limite di pagina successivo.

Poiché la memoria fisica contigua è in genere in breve fornitura, deve essere usata in modo spasparente e solo quando necessario. Un driver che deve usare memoria contigua deve allocare questa memoria durante l'inizializzazione del driver perché è probabile che la memoria fisica diventi frammentata nel tempo perché il sistema operativo alloca e libera memoria. In genere, un driver chiama MmAllocateContiguousNodeMemory dalla routine DriverEntry per allocare un buffer interno per l'uso a lungo termine e libera il buffer appena prima che il driver venga scaricato.

La memoria allocata da MmAllocateContiguousNodeMemory deve essere liberata quando la memoria non è più necessaria. Chiamare la routine MmFreeContiguousMemory per liberare memoria allocata da MmAllocateContiguousNodeMemory.

MmAllocateContiguousNodeMemory è simile alla routine MmAllocateContiguousMemorySpecifyCacheNode . A differenza di MmAllocateContiguousMemorySpecifyCacheNode, MmAllocateContiguousNodeMemory può essere usato per allocare memoria senza esecuzione (NX). Come procedura consigliata, un driver deve allocare memoria NX a meno che il driver non richieda in modo esplicito la possibilità di eseguire istruzioni nella memoria allocata. Assegnando memoria NX, un driver migliora la sicurezza impedendo l'esecuzione di istruzioni dannose in questa memoria. La memoria allocata da MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCache e MmAllocateContiguousMemorySpecifyCacheNode è sempre eseguibile.

Se si specifica un valore diverso da zero per il parametro BoundaryAddressMultiple , l'intervallo di indirizzi fisici del blocco di memoria allocato non supera un limite di indirizzo che corrisponde a un numero intero multiplo di questo valore. Un driver deve impostare questo parametro su zero a meno che non sia necessario un valore diverso da zero per risolvere una limitazione hardware. Ad esempio, se un dispositivo non riesce a trasferire i dati tra i limiti fisici di 16 megabyte, il driver deve specificare un valore di 0x1000000 per questo parametro per assicurarsi che gli indirizzi che il dispositivo vede non eseguano il wrapping in un limite di 16 megabyte.

Memoria che MmAllocateContiguousNodeMemory alloca è non inizializzata. Un driver in modalità kernel deve prima zero questa memoria se lo rende visibile al software in modalità utente (per evitare la perdita di contenuti potenzialmente privilegiati).

Requisiti

Requisito Valore
Client minimo supportato Disponibile a partire da Windows 8.
Piattaforma di destinazione Universale
Intestazione ntddk.h (include Wdm.h, Ntddk.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Vedi anche

DriverEntry

MmAllocateContiguousMemory

MmAllocateContiguousMemorySpecifyCache

MmAllocateContiguousMemorySpecifyCacheNode

MmFreeContiguousMemory