Funzione MmAllocatePagesForMdlEx (wdm.h)
La routine MmAllocatePagesForMdlEx alloca pagine di memoria fisica non impaginate a un MDL.
Usare questa routine anziché MmAllocatePagesForMdl.
Sintassi
PMDL MmAllocatePagesForMdlEx(
[in] PHYSICAL_ADDRESS LowAddress,
[in] PHYSICAL_ADDRESS HighAddress,
[in] PHYSICAL_ADDRESS SkipBytes,
[in] SIZE_T TotalBytes,
[in] MEMORY_CACHING_TYPE CacheType,
[in] ULONG Flags
);
Parametri
[in] LowAddress
Specifica l'indirizzo fisico dell'inizio del primo intervallo di indirizzi da cui possono venire le pagine allocate. Se MmAllocatePagesForMdlEx non può allocare il numero richiesto di byte nel primo intervallo di indirizzi, esegue l'iterazione tramite intervalli di indirizzi aggiuntivi per ottenere altre pagine. A ogni iterazione, MmAllocatePagesForMdlEx aggiunge il valore di SkipBytes all'indirizzo iniziale precedente per ottenere l'inizio dell'intervallo di indirizzi successivo.
[in] HighAddress
Specifica l'indirizzo fisico della fine del primo intervallo di indirizzi da cui possono venire le pagine allocate.
[in] SkipBytes
Specifica il numero di byte da ignorare dall'inizio dell'intervallo di indirizzi precedente da cui possono venire le pagine allocate. SkipBytes deve essere un numero intero di dimensioni della pagina di memoria virtuale, in byte.
[in] TotalBytes
Specifica il numero totale di byte da allocare per MDL.
[in] CacheType
Specifica un valore MEMORY_CACHING_TYPE , che indica il tipo di memorizzazione nella cache consentita per la memoria richiesta.
[in] Flags
Specifica i flag per questa operazione. Impostare questo parametro su zero o sull'OR bit per bit di uno o più dei flag MM_ALLOCATE_XXX seguenti:
Gli ultimi quattro elementi nell'elenco precedente sono supportati solo nelle versioni di Windows 7 e versioni successive di Windows.
Valore | Significato |
---|---|
MM_DONT_ZERO_ALLOCATION 0x00000001 | Non riempire le pagine allocate con zero. Per impostazione predefinita, MmAllocatePagesForMdlEx zero le pagine allocate. Ignorando questa operazione, è possibile migliorare le prestazioni della chiamata MmAllocatePagesForMdlEx. Tuttavia, non è necessario usare questo flag a meno che non si espongono mai le pagine allocate ai programmi in modalità utente o si sovrascrive sempre il contenuto originale delle pagine prima di esporre le pagine allocate ai programmi in modalità utente. |
MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002 | Allocare pagine solo dal nodo ideale. Questo flag si applica solo ai sistemi multiprocessore che dispongono di architetture NUMA (Non Uniform Memory Access). A partire da Windows Vista, questo flag indica che tutte le pagine devono essere allocate dal nodo ideale del thread corrente. Nessuna pagina deve essere allocata da altri nodi. Nelle versioni di Windows precedenti a Windows Vista, questo flag indica che tutte le pagine devono essere allocate dal nodo locale; ovvero dal nodo a cui appartiene il processore corrente. Per altre informazioni sui sistemi multiprocessore NUMA, vedere Supporto NUMA . |
MM_ALLOCATE_FULLY_REQUIRED 0x00000004 | È necessaria un'allocazione completa. A partire da Windows 7, questo flag richiede mmAllocatePagesForMdlEx di restituire NULL se non può allocare tutte le pagine richieste. La routine restituisce un valore non NULL solo se ottiene correttamente l'intera allocazione richiesta. Questo flag consente alla gestione memoria di eseguire l'allocazione in modo più efficiente nei casi in cui il chiamante richiede un'allocazione completa. |
MM_ALLOCATE_NO_WAIT 0x00000008 | Non aspettare. A partire da Windows 7, questo flag indica che la chiamata MmAllocatePagesForMdlEx non deve bloccare il thread chiamante. In genere, il chiamante è un driver in modalità kernel in esecuzione in IRQL < DISPATCH_LEVEL ma non può consentire il blocco dell'esecuzione. Ad esempio, il driver potrebbe essere utile per il paging o le operazioni di gestione delle energia. Indipendentemente dal fatto che questo flag sia impostato, MmAllocatePagesForMdlEx non blocca mai i chiamanti in esecuzione in IRQL = DISPATCH_LEVEL. |
MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010 | L'allocazione viene eseguita in modo da ridurre al minimo la frammentazione della memoria di sistema. A partire da Windows 7, questo flag indica che il chiamante vuole evitare di frammentare la memoria fisica per rendere disponibile memoria più contigua ad altri chiamanti. Le pagine allocate non sono garantite (e in genere non sono) fisicamente contigue, anche se è disponibile una quantità di memoria contigua. I chiamanti che richiedono memoria contigua devono specificare MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS anziché MM_ALLOCATE_PREFER_CONTIGUOUS. |
MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020 | La memoria contigua è necessaria. A partire da Windows 7, questo flag indica che le pagine richieste devono essere allocate come blocchi contigui di memoria fisica. Se il parametro SkipBytes è zero, MmAllocatePagesForMdlEx riesce e restituisce un singolo blocco contiguo o restituisce NULL. Non restituisce mai un'allocazione parziale. Per SkipBytes = 0, le pagine allocate soddisfano i requisiti dell'intervallo di indirizzi specificati dai parametri LowAddress e HighAddress, ma le pagine sono soggette a restrizioni di allineamento speciali. Se SkipBytes è diverso da zero, SkipBytes deve essere una potenza di due e deve essere maggiore o uguale a PAGE_SIZE e il valore del parametro TotalBytes deve essere un multiplo di SkipBytes. In questo caso, il MDL restituito può contenere più blocchi di pagine contigue. Ovvero, ogni blocco è internamente contiguo, ma i blocchi non sono necessariamente contigui tra loro. Ogni blocco di pagine contigue è garantito essere esattamente SkipBytes long e da allineare su un limite SkipBytes. Le allocazioni parziali possono verificarsi se SkipBytes è diverso da zero, ma ogni blocco contiguo in un'allocazione parziale è garantito come SkipBytes long. |
MM_ALLOCATE_FAST_LARGE_PAGES 0x00000040 | A partire da Windows 8, questo flag specifica che l'allocazione deve essere soddisfatta dalla cache di pagine di grandi dimensioni del sistema operativo. Se la cache è vuota, l'allocazione ha esito negativo. Se MM_ALLOCATE_FAST_LARGE_PAGES non è specificato, MmAllocatePagesForMdlEx usa pagine di grandi dimensioni memorizzate nella cache se disponibili. Se la cache viene esaurita, MmAllocatePagesForMdlEx tenta di costruire pagine di grandi dimensioni aggiuntive, che potrebbero richiedere molto tempo. MM_ALLOCATE_FAST_LARGE_PAGES deve essere usato con il flag di MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS. Il parametro SkipBytes deve essere impostato su più dimensioni di pagina di grandi dimensioni. |
MM_ALLOCATE_AND_HOT_REMOVE 0x00000100 | A partire da Windows 10, questo flag causa la rimozione delle pagine allocate dal pool di memoria fisica gestita da Windows. non è possibile specificare MM_ALLOCATE_AND_HOT_REMOVE insieme a MM_ALLOCATE_FULLY_REQUIRED. Se viene specificato MM_ALLOCATE_AND_HOT_REMOVE, il chiamante deve essere in esecuzione in IRQL = PASSIVE_LEVEL. |
Valore restituito
MmAllocatePagesForMdlEx restituisce uno dei seguenti elementi:
Codice restituito | Descrizione |
---|---|
Puntatore MDL | Un valore restituito non NULL è un puntatore a un MDL che descrive un set di pagine fisiche nell'intervallo di indirizzi specificato. Se il numero richiesto di byte non è disponibile, MDL descrive la quantità di memoria fisica disponibile. |
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 il MDL stesso. |
Commenti
Per impostazione predefinita, le pagine di memoria fisica restituite da MmAllocatePagesForMdlEx non sono pagine contigue. A partire da Windows 7, i chiamanti possono eseguire l'override del comportamento predefinito di questa routine impostando il bit di MM_ALLOCATE_PREFER_CONTIGUOUS o MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS flag nel parametro Flags .
MmAllocatePagesForMdlEx è progettato per i driver in modalità kernel che non necessitano di indirizzi virtuali corrispondenti, ovvero richiedono 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, MmAllocatePagesForMdlEx 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 all'MDL.
Il chiamante deve usare MmFreePagesFromMdl per rilasciare le pagine di memoria descritte da un MDL creato da MmAllocatePagesForMdlEx. Dopo aver chiamato MmFreePagesFromMdl, il chiamante deve anche chiamare ExFreePool per rilasciare la memoria allocata per la struttura MDL.
Per impostazione predefinita, MmAllocatePagesForMdlEx riempie le pagine allocate con zero. Il chiamante può specificare il flag di MM_DONT_ZERO_ALLOCATION per eseguire l'override di questo valore predefinito e per migliorare eventualmente le prestazioni.
La memoria che MmAllocatePagesForMdlEx alloca è 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 sta per rendere 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 MmAllocatePagesForMdlEx 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.
MmAllocatePagesForMdlEx viene eseguito in IRQL <= APC_LEVEL. I chiamanti di MmAllocatePagesForMdlEx possono essere in DISPATCH_LEVEL. Tuttavia, è possibile migliorare le prestazioni del driver chiamando in APC_LEVEL o sotto.
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Universale |
Intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Libreria | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | Vedere La sezione Osservazioni. |
Regole di conformità DDI | IrqlMmApcLte(wdm) |