Funzione MmAllocateContiguousMemorySpecifyCacheNode (wdm.h)

La routine MmAllocateContiguousMemorySpecifyCacheNode alloca un intervallo di memoria fisica contigua e non di paging ed esegue il mapping allo spazio indirizzi del sistema.

Sintassi

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

Parametri

[in] NumberOfBytes

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

[in] LowestAcceptableAddress

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

[in] HighestAcceptableAddress

Indirizzo fisico valido più alto che il chiamante può usare. Ad esempio, se un dispositivo può indirizzare solo le 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 essere sempre 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] CacheType

Specifica un valore MEMORY_CACHING_TYPE , che indica il tipo di memorizzazione nella cache richiesta per la memoria fisica contigua.

[in] PreferredNode

Numero di nodo preferito. Se un sistema multiprocessore contiene N nodi, i nodi vengono numerati da 0 a N-1. Se viene specificato MM_ANY_NODE_OK o il computer ha un solo nodo, l'allocazione viene soddisfatta da qualsiasi nodo. In caso contrario, l'allocazione viene eseguita dal nodo preferito o se non è possibile trovare un intervallo soddisfacente dal nodo preferito, viene restituito NULL .

Valore restituito

MmAllocateContiguousMemorySpecifyCacheNode 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. In un sistema multiprocessore NUMA (Non-Uniform Memory Access) 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 , MmAllocateContiguousMemorySpecifyCacheNode considera tutta la memoria appartenente a un singolo nodo e alloca memoria da questo nodo.

MmAllocateContiguousMemorySpecifyCacheNode alloca un blocco di memoria non di paging 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 della pagina successiva.

Poiché la memoria fisica contigua è in genere in breve fornitura, deve essere usata con moderazione 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 venga frammentata nel corso del tempo man mano che il sistema operativo alloca e libera memoria. In genere, un driver chiama MmAllocateContiguousMemorySpecifyCacheNode dalla routine DriverEntry per allocare un buffer interno per l'uso a lungo termine e libera il buffer subito prima che il driver venga scaricato.

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

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 è 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 aggirare una limitazione hardware. Ad esempio, se un dispositivo non è in grado di trasferire dati attraverso limiti fisici di 16 megabyte, il driver deve specificare un valore di 0x1000000 per questo parametro per garantire che gli indirizzi visualizzati dal dispositivo non eseguano il wrapping in un limite di 16 megabyte.

Se si usa la routine MmAllocateContiguousMemorySpecifyCacheNode nei computer con grandi quantità di memoria, le prestazioni del sistema operativo potrebbero peggiorare gravemente quando il sistema tenta di creare un blocco contiguo di memoria. Questa riduzione è notevolmente ridotta a partire da Windows Vista SP1 e Windows Server 2008, ma la memoria contigua può comunque essere costosa da allocare. Per questo motivo, i driver devono evitare chiamate ripetute a MmAllocateContiguousMemorySpecifyCacheNode. Al contrario, i driver devono allocare tutti i buffer contigui necessari nelle routine DriverEntry e riutilizzare questi buffer.

La memoria allocata MmAllocateContiguousMemorySpecifyCacheNode 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
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h, Ntddk.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Vedi anche

DriverEntry

MEMORY_CACHING_TYPE

MmFreeContiguousMemory