Funzione MmAllocateContiguousMemory (wdm.h)

La routine MmAllocateContiguousMemory alloca un intervallo di memoria fisica contigua, non impaginata e la esegue il mapping allo spazio indirizzi del sistema.

Sintassi

PVOID MmAllocateContiguousMemory(
  [in] SIZE_T           NumberOfBytes,
  [in] PHYSICAL_ADDRESS HighestAcceptableAddress
);

Parametri

[in] NumberOfBytes

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

[in] HighestAcceptableAddress

L'indirizzo fisico più valido che il chiamante può usare. Ad esempio, se un dispositivo può indirizzare solo posizioni nei primi 16 megabyte dell'intervallo di indirizzi di memoria fisica del processore, il driver per questo dispositivo deve impostare HighestAcceptableAddress su 0x0000000000FFFFFF. Se non sono presenti requisiti specifici per l'allocazione della memoria, impostare su MAXULONG64.

Valore restituito

MmAllocateContiguousMemory restituisce l'indirizzo virtuale di base per la memoria allocata. Se la richiesta non può essere soddisfatta, la routine restituisce NULL.

Commenti

MmAllocateContiguousMemory alloca un blocco di memoria non impaginato 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 di pagina successivo.

Poiché la memoria fisica contigua è in genere in breve fornitura, deve essere usata in modo spasparente 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 diventi frammentata nel tempo perché il sistema operativo alloca e libera memoria. In genere, un driver chiama MmAllocateContiguousMemory dalla routine DriverEntry per allocare un buffer interno per l'uso a lungo termine e libera il buffer appena prima che il driver venga scaricato.

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

Quando la memoria fisica viene frammentata in un computer con una grande quantità di RAM, le chiamate a MmAllocateContiguousMemory, che richiedono al sistema operativo di cercare blocchi contigui di memoria, possono compromettere notevolmente le prestazioni. 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 MmAllocateContiguousMemory. I driver devono invece allocare tutti i buffer contigui necessari nelle routine DriverEntry e riutilizzare questi buffer.

Memoria che MmAllocateContiguousMemory alloca è non inizializzata. Un driver in modalità kernel deve prima impostare questa memoria su zero 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

AllocateCommonBuffer

DriverEntry

MmAllocateContiguousMemorySpecifyCache

MmAllocateNonCachedMemory

MmFreeContiguousMemory