Funzione MmAllocatePagesForMdl (wdm.h)

La routine MmAllocatePagesForMdl alloca pagine di memoria fisica senza riempimento, senza pagine di pagina a un MDL.

Sintassi

PMDL MmAllocatePagesForMdl(
  [in] PHYSICAL_ADDRESS LowAddress,
  [in] PHYSICAL_ADDRESS HighAddress,
  [in] PHYSICAL_ADDRESS SkipBytes,
  [in] SIZE_T           TotalBytes
);

Parametri

[in] LowAddress

Specifica l'indirizzo fisico dell'inizio del primo intervallo di indirizzi da cui possono venire le pagine allocate. Se MmAllocatePagesForMdl 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. In ogni iterazione, MmAllocatePagesForMdl 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.

Valore restituito

MmAllocatePagesForMdl restituisce uno dei seguenti:

Codice restituito Descrizione
Puntatore MDL Il puntatore MDL 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 Non sono presenti pagine di memoria fisica negli intervalli di indirizzi specificati oppure non è disponibile un pool di memoria sufficiente per il MDL stesso.

Commenti

I driver in esecuzione in Windows Server 2003 Service Pack 1 (SP1) e versioni successive di Windows devono usare la routine MmAllocatePagesForMdlEx anziché MmAllocatePagesForMdl. MmAllocatePagesForMdlEx offre prestazioni migliori rispetto a MmAllocatePagesForMdl evitando gli scaricamenti non necessari del buffer lookaside (TLB) e della memoria della cache.

Le pagine di memoria fisica restituite da MmAllocatePagesForMdl sono in genere pagine non contigue. MmAllocatePagesForMdl riempie sempre le pagine allocate nel MDL restituito con zero.

MmAllocatePagesForMdl è progettato per essere usato dai driver in modalità kernel che non necessitano di indirizzi virtuali corrispondenti( ovvero, hanno bisogno di pagine fisiche e non devono essere fisicamente contigue) o dai 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. Un driver per una scheda grafica AGP è un esempio di tale driver.

A seconda della quantità di memoria fisica attualmente disponibile negli intervalli richiesti, MmAllocatePagesForMdl potrebbe restituire un MDL che descrive meno memoria di quanto richiesto. La routine restituisce 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 MmAllocatePagesForMdl. Dopo aver chiamato MmFreePagesFromMdl, il chiamante deve anche chiamare ExFreePool per rilasciare la memoria allocata per la struttura MDL stessa.

In Windows 2000 e versioni successive di Windows, la quantità massima di memoria che MmAllocatePagesForMdl 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.

MmAllocatePagesForMdl viene eseguito in IRQL <= APC_LEVEL. Windows Server 2008 e versioni successive del sistema operativo Windows consentono ai chiamanti MmAllocatePagesForMdl di chiamare in DISPATCH_LEVEL. Tuttavia, è possibile migliorare le prestazioni del driver chiamando in APC_LEVEL o sotto.

La chiamata a MmAllocatePagesForMdl da una chiamata di routine asincrona del kernel speciale (APC) può portare a un'acquisizione ricorsiva di un blocco esclusivo, che si trova solo in un'area critica (utenti o normali API kernel disabilitate) ma non in un'area protetta (tutte le API disabilitate).

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 HwStorPortProhibitedDDDIs(storport), IrqlMmApcLte(wdm), SpNoWait(storport), StorPortStartIo(storport)

Vedi anche

ExFreePool

MmAllocatePagesForMdlEx

MmFreePagesFromMdl

MmMapLockedPages