Funzione MmAllocateContiguousMemorySpecifyCache (wdm.h)

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

Sintassi

PVOID MmAllocateContiguousMemorySpecifyCache(
  [in]           SIZE_T              NumberOfBytes,
  [in]           PHYSICAL_ADDRESS    LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS    HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS    BoundaryAddressMultiple,
  [in]           MEMORY_CACHING_TYPE CacheType
);

Parametri

[in] NumberOfBytes

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

[in] LowestAcceptableAddress

Indirizzo fisico più basso valido che il chiamante può usare. Ad esempio, se un dispositivo può indirizzare solo le posizioni sopra i primi 8 megabyte dell'intervallo di indirizzi di memoria fisica del processore, il driver per questo dispositivo deve impostare LowestAcceptableAddress su 0x0000000000800000.

[in] HighestAcceptableAddress

Indirizzo fisico valido più alto 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.

[in, optional] BoundaryAddressMultiple

Indirizzo fisico multiplo che il buffer allocato non deve attraversare. Un indirizzo fisico multiplo deve essere sempre una potenza di due. Questo parametro è facoltativo e può essere specificato come zero per indicare che il dispositivo non ha restrizioni di limiti di memoria speciali. Per altre informazioni, vedere la sezione Osservazioni.

[in] CacheType

Specifica un valore MEMORY_CACHING_TYPE , che indica il tipo di memorizzazione nella cache consentita per la memoria richiesta.

Valore restituito

MmAllocateContiguousMemorySpecifyCache restituisce l'indirizzo virtuale di base per la memoria allocata. Se il sistema non è in grado di allocare il buffer richiesto, la routine restituisce NULL.

Commenti

MmAllocateContiguousMemorySpecifyCache 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 man mano che il sistema operativo alloca e libera memoria. In genere, un driver chiama MmAllocateContiguousMemorySpecifyCache dalla routine DriverEntry 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 MmAllocateContiguousMemorySpecifyCache deve essere liberata quando la memoria non è più necessaria. Chiamare la routine MmFreeContiguousMemory per liberare memoria allocata da MmAllocateContiguousMemorySpecifyCache.

Se si specifica un valore diverso da zero per il parametro BoundaryAddressMultiple , l'intervallo di indirizzi fisici del blocco di memoria allocato non supera un limite di indirizzo che è un numero intero multiplo di questo valore. Un driver deve impostare questo parametro su zero, a meno che non sia necessario un valore diverso da zero per aggirare una limitazione hardware. Ad esempio, se un dispositivo non è in grado di trasferire dati attraverso limiti fisici di 16 megabyte, il driver deve specificare un valore di 0x1000000 per questo parametro per garantire che gli indirizzi visualizzati dal dispositivo non eseguano il wrapping in un limite di 16 megabyte.

Se si utilizza la routine MmAllocateContiguousMemorySpecifyCache nei computer con grandi quantità di memoria, le prestazioni del sistema operativo potrebbero peggiorare gravemente quando il sistema tenta di creare un blocco contiguo di memoria. 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 MmAllocateContiguousMemorySpecifyCache. Al contrario, i driver devono allocare tutti i buffer contigui necessari nelle routine DriverEntry e riutilizzare questi buffer.

La memoria allocata MmAllocateContiguousMemorySpecifyCache non è inizializzata. Un driver in modalità kernel deve prima zero questa memoria 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 <= DISPATCH_LEVEL

Vedi anche

MmAllocateContiguousMemory

MmFreeContiguousMemory