Funzione MmAllocatePagesForMdl (wdm.h)
La routine MmAllocatePagesForMdl alloca pagine di memoria fisica con riempimento zero, non di paging 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 è in grado di allocare il numero di byte richiesto nel primo intervallo di indirizzi, scorre gli intervalli di indirizzi aggiuntivi per ottenere più pagine. A 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 provenire le pagine allocate. skipbytes deve essere un multiplo intero delle 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 elementi:
Codice restituito | Descrizione |
---|---|
puntatore MDL | Il puntatore MDL descrive un set di pagine fisiche nell'intervallo di indirizzi specificato. Se il numero di byte richiesto non è disponibile, il file MDL descrive la quantità di memoria fisica disponibile. |
NULL | Non sono presenti pagine di memoria fisica negli intervalli di indirizzi specificati o non è disponibile un pool di memoria sufficiente per il file MDL stesso. |
Osservazioni
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 scaricamenti non necessari del buffer lookaside (TLB) e della memoria della cache.
Le pagine di memoria fisica restituite da MmAllocatePagesForMdl in genere non sono pagine contigue. MmAllocatePagesForMdl riempie sempre le pagine allocate nel file MDL restituito con zeri.
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 necessitano di pagine fisicamente contigue) o da driver in modalità kernel che possono ottenere notevoli miglioramenti 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 al file MDL.
Il chiamante deve utilizzare 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 abilitano MmAllocatePagesForMdl chiamanti da chiamare in DISPATCH_LEVEL. Tuttavia, è possibile migliorare le prestazioni del driver chiamando APC_LEVEL o versione successiva.
La chiamata a MmAllocatePagesForMdl da una chiamata di procedura asincrona del kernel speciale (APC) può portare a un'acquisizione ricorsiva di un blocco esclusivo, che si trova solo in un'area critica (le API utente o normali kernel disabilitate) ma non in un'area protetta (tutte le API disabilitate).
Fabbisogno
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 | HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm), SpNoWait(storport), StorPortStartIo(storport) |