Condividi tramite


Funzione MmAllocateContiguousMemory (ntddk.h)

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

Sintassi

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

Parametri

[in] NumberOfBytes

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

[in] HighestAcceptableAddress

L'indirizzo fisico più alto valido che il chiamante può usare. Ad esempio, se un dispositivo può indirizzare solo le posizioni nei primi 16 megabyte dell'intervallo di indirizzi di memoria fisica del processore, il driver per questo dispositivo deve impostare HighestAcceptableAddress su 0x0000000000FFFFFF.

Valore restituito

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

Osservazioni

MmAllocateContiguousMemory alloca un blocco di memoria non di paging 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 della pagina successiva.

Poiché la memoria fisica contigua è in genere in breve fornitura, deve essere usata con moderazione 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 venga frammentata nel corso del tempo quando il sistema operativo alloca e libera memoria. In genere, un driver chiama MmAllocateContiguousMemory dalla routine DriverEntry di per allocare un buffer interno per l'uso a lungo termine e libera il buffer subito 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 gravemente 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 allocazioni 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).

Fabbisogno

Requisito Valore
client minimo supportato Disponibile a partire da Windows 2000.
piattaforma di destinazione Universale
intestazione ntddk.h (include Wdm.h, Ntddk.h)
libreria NtosKrnl.lib
dll NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Vedere anche

AllocateCommonBuffer

DriverEntry

MmAllocateContiguousMemorySpecifyCache

MmAllocateNonCachedMemory

MmFreeContiguousMemory