Condividi tramite


Funzione MmAllocateNodePagesForMdlEx (wdm.h)

La routine MmAllocateNodePagesForMdlEx alloca memoria fisica non di paging da un nodo ideale e alloca una struttura MDL per descrivere questa memoria.

Sintassi

PMDL MmAllocateNodePagesForMdlEx(
  [in] PHYSICAL_ADDRESS    LowAddress,
  [in] PHYSICAL_ADDRESS    HighAddress,
  [in] PHYSICAL_ADDRESS    SkipBytes,
  [in] SIZE_T              TotalBytes,
  [in] MEMORY_CACHING_TYPE CacheType,
  [in] ULONG               IdealNode,
  [in] ULONG               Flags
);

Parametri

[in] LowAddress

Indirizzo fisico dell'inizio del primo intervallo di indirizzi da cui possono venire le pagine allocate. Se MmAllocateNodePagesForMdlEx non può allocare il numero di byte richiesto nel primo intervallo di indirizzi, la routine scorre gli intervalli di indirizzi aggiuntivi per ottenere altre pagine. A ogni iterazione , MmAllocateNodePagesForMdlEx aggiunge il valore SkipBytes all'indirizzo iniziale precedente per calcolare l'inizio dell'intervallo di indirizzi successivo.

[in] HighAddress

Indirizzo fisico della fine del primo intervallo di indirizzi da cui possono provenire le pagine allocate.

[in] SkipBytes

Numero di byte da cui ignorare dall'inizio dell'intervallo di indirizzi precedente da cui possono provenire le pagine allocate. SkipBytes deve essere un multiplo intero delle dimensioni della pagina di memoria virtuale, in byte.

[in] TotalBytes

Numero totale di byte da allocare per il file MDL.

[in] CacheType

Valore MEMORY_CACHING_TYPE , che indica il tipo di memorizzazione nella cache consentita per la memoria richiesta.

[in] IdealNode

Numero di nodo ideale. Se un sistema multiprocessore contiene N nodi, i numeri di nodo validi sono compresi nell'intervallo da 0 a N-1. Il driver può chiamare la routine KeQueryHighestNodeNumber per ottenere il numero di nodo più alto. Un sistema multiprocessore a processore singolo o non NUMA ha un solo nodo, nodo 0, da cui allocare memoria. Per un sistema multiprocessore NUMA, l'allocazione viene eseguita dal nodo ideale, se possibile. Se nel nodo ideale è disponibile memoria insufficiente per soddisfare la richiesta di allocazione e il chiamante non imposta il flag MM_ALLOCATE_FROM_LOCAL_NODE_ONLY, MmAllocateNodePagesForMdlEx tenterà di allocare memoria da altri nodi.

[in] Flags

Flag per questa operazione. Impostare questo parametro su zero o sull'OR bit per bit di uno o più dei bit di flag seguenti:

  • MM_DONT_ZERO_ALLOCATION

  • MM_ALLOCATE_FROM_LOCAL_NODE_ONLY

  • MM_ALLOCATE_FULLY_REQUIRED

  • MM_ALLOCATE_NO_WAIT

  • MM_ALLOCATE_PREFER_CONTIGUOUS

  • MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS

  • MM_ALLOCATE_AND_HOT_REMOVE

Per altre informazioni su questi flag, vedere MM_ALLOCATE_XXX.

Valore restituito

MmAllocateNodePagesForMdlEx restituisce un puntatore a una struttura MDL in caso di esito positivo. In caso contrario, se la routine non riesce ad allocare memoria, la routine restituisce NULL.

Un valore restituito NULL indica che non sono disponibili pagine di memoria fisica negli intervalli di indirizzi specificati o che non è disponibile un pool di memoria sufficiente per allocare la struttura MDL.

Se la routine alloca correttamente alcune, ma non tutte, della memoria richiesta, il file MDL descrive la quantità di memoria fisica che la routine è stata in grado di allocare.

Commenti

In un sistema multiprocessore NUMA (Non-Uniform Memory Access) il chiamante può specificare un nodo ideale 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 , MmAllocateNodePagesForMdlEx considera tutta la memoria come appartenente a un singolo nodo e alloca la memoria da questo nodo.

Per impostazione predefinita, le pagine di memoria fisica restituite da MmAllocateNodePagesForMdlEx non sono pagine contigue. I chiamanti possono eseguire l'override del comportamento predefinito di questa routine impostando il bit del flag MM_ALLOCATE_PREFER_CONTIGUOUS o MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS nel parametro Flags .

MmAllocateNodePagesForMdlEx non esegue il mapping della memoria fisica allocata in memoria virtuale. Se necessario, il chiamante può chiamare una routine come MmMapLockedPagesSpecifyCache per eseguire il mapping delle pagine di memoria fisica descritte dal linguaggio MDL.

MmAllocateNodePagesForMdlEx è progettato per i driver in modalità kernel che non necessitano di indirizzi virtuali corrispondenti( ovvero, hanno bisogno di pagine fisiche e non devono essere fisicamente contigue) e per i driver in modalità kernel che possono ottenere miglioramenti sostanziali delle prestazioni se la memoria fisica per un dispositivo viene allocata in un intervallo di indirizzi fisici specifico (ad esempio, una scheda grafica AGP).

A seconda della quantità di memoria fisica attualmente disponibile negli intervalli richiesti, MmAllocateNodePagesForMdlEx potrebbe restituire un MDL che descrive meno memoria di quanto richiesto. La routine potrebbe anche restituire NULL se non è stata allocata alcuna memoria. Il chiamante deve controllare la quantità di memoria effettivamente allocata, come descritto dal linguaggio MDL.

Il chiamante deve usare MmFreePagesFromMdl per rilasciare le pagine di memoria descritte da un MDL creato da MmAllocateNodePagesForMdlEx. Dopo aver chiamato MmFreePagesFromMdl, il chiamante deve anche chiamare ExFreePool per rilasciare la memoria allocata per la struttura MDL.

Per impostazione predefinita, MmAllocateNodePagesForMdlEx riempie le pagine allocate con zeri. Il chiamante può specificare il flag MM_DONT_ZERO_ALLOCATION per eseguire l'override di questa impostazione predefinita e per migliorare eventualmente le prestazioni.

La memoria allocata da MmAllocateNodePagesForMdlEx non è inizializzata se si specifica il flag di MM_DONT_ZERO_ALLOCATION. Un driver in modalità kernel deve prima zero questa memoria se il driver renderà visibile la memoria al software in modalità utente (per evitare la perdita di contenuti potenzialmente privilegiati). Per altre informazioni su questo flag, vedere MM_ALLOCATE_XXX.

La quantità massima di memoria che MmAllocateNodePagesForMdlEx può allocare in una singola chiamata è (4 gigabyte - PAGE_SIZE). La routine può soddisfare una richiesta di allocazione per questo importo solo se sono disponibili pagine sufficienti.

MmAllocateNodePagesForMdlEx viene eseguito in IRQL <= APC_LEVEL. Se necessario, il driver può chiamare MmAllocateNodePagesForMdlEx all'indirizzo DISPATCH_LEVEL. Tuttavia, è possibile migliorare le prestazioni del driver chiamando a APC_LEVEL o di seguito.

Requisiti

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

Vedi anche

ExFreePool

KeQueryHighestNodeNumber

MDL

MEMORY_CACHING_TYPE

MM_ALLOCATE_XXX

MmFreePagesFromMdl

MmMapLockedPagesSpecifyCache