PALLOCATE_COMMON_BUFFER funzione di callback (wdm.h)
La routine AllocateCommonBuffer alloca la memoria e la esegue il mapping in modo che sia accessibile simultaneamente dal processore e da un dispositivo per le operazioni DMA.
Sintassi
PALLOCATE_COMMON_BUFFER PallocateCommonBuffer;
PVOID PallocateCommonBuffer(
[in] PDMA_ADAPTER DmaAdapter,
[in] ULONG Length,
[out] PPHYSICAL_ADDRESS LogicalAddress,
[in] BOOLEAN CacheEnabled
)
{...}
Parametri
[in] DmaAdapter
Puntatore alla struttura DMA_ADAPTER restituita da IoGetDmaAdapter che rappresenta l'adattatore master del bus o il controller DMA.
[in] Length
Specifica il numero di byte di memoria da allocare.
[out] LogicalAddress
Puntatore a una variabile che riceve l'indirizzo logico che il dispositivo può usare per accedere al buffer allocato. Usare questo indirizzo anziché chiamare MmGetPhysicalAddress perché il sistema può prendere in considerazione eventuali restrizioni di memoria specifiche della piattaforma.
[in] CacheEnabled
Specifica se la memoria allocata può essere memorizzata nella cache.
Questo parametro viene ignorato. Il sistema operativo determina se abilitare la memoria memorizzata nella cache nel buffer comune allocato. Tale decisione si basa sull'architettura del processore e sul bus di dispositivo.
Nei computer con processori basati su x86, basati su x64 e basati su Itanium, la memoria memorizzata nella cache è abilitata. Si presuppone che tutte le operazioni DMA eseguite da un dispositivo siano coerenti con le cache della CPU pertinenti, che potrebbero essere memorizzare nella cache tale memoria. Se il driver deve disabilitare la memorizzazione nella cache, chiamare invece AllocateCommonBufferEx .
Nei computer con processori basati su ARM o ARM 64, il sistema operativo non abilita automaticamente la memoria memorizzata nella cache per tutti i dispositivi. Il sistema si basa sul metodo ACPI_CCA per ogni dispositivo per determinare se il dispositivo è coerente con la cache.
Valore restituito
AllocateCommonBuffer restituisce l'indirizzo virtuale di base dell'intervallo allocato. Se il buffer non può essere allocato, restituisce NULL.
Commenti
AllocateCommonBuffer non è una routine di sistema che può essere chiamata direttamente in base al nome. Questa routine è chiamabile solo per puntatore dall'indirizzo restituito in una struttura di DMA_OPERATIONS . I driver ottengono l'indirizzo di questa routine chiamando IoGetDmaAdapter.
AllocateCommonBuffer supporta DMA in cui il dispositivo e il processore comunicano continuamente tramite memoria di sistema, come in una struttura di controllo per un dispositivo DMA master del bus.
AllocateCommonBuffer supporta anche i dispositivi subordinati i cui driver usano la modalità autoinitialize del controller DMA di sistema.
AllocateCommonBuffer esegue le operazioni seguenti:
- Alloca memoria raggiungibile sia dal processore che dal dispositivo. Questa memoria viene visualizzata contigua al dispositivo.
- Alloca i registri mappa per eseguire il mapping del buffer, se richiesto dal sistema.
- Configura una traduzione per il dispositivo, incluso il caricamento dei registri della mappa, se necessario.
Se un driver necessita di diverse pagine di spazio buffer comune, ma le pagine non devono essere contigue, il driver deve effettuare diverse richieste a una pagina per AllocareCommonBuffer anziché una richiesta di grandi dimensioni. Questo approccio conserva la memoria contigua.
I driver in genere chiamano AllocateCommonBuffer come parte dell'avvio del dispositivo, durante la risposta a una richiesta di IRP_MN_START_DEVICE PnP. Dopo l'avvio, è possibile che le richieste di una sola pagina abbiano esito positivo, se presente.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Disponibile a partire da Windows 2000. |
Piattaforma di destinazione | Desktop |
Intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | PASSIVE_LEVEL |
Regole di conformità DDI | IrqlDispatch(wdm) |