Condividi tramite


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.
Per usare la memoria del sistema residente in modo economico, i driver devono allocare il minor numero possibile di questi buffer per dispositivo. AllocateCommonBuffer alloca almeno una pagina di memoria, indipendentemente dalla lunghezza richiesta. Dopo aver completato la richiesta di allocazione meno di PAGE_SIZE byte, il chiamante può accedere solo alla lunghezza richiesta. Dopo una richiesta di allocazione corretta che richiede più di un multiplo integrale di PAGE_SIZE byte, tutti i byte rimanenti nell'ultima pagina allocata non sono accessibili al chiamante.

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)

Vedi anche

DMA_ADAPTER

DMA_OPERATIONS

FreeCommonBuffer

IoGetDmaAdapter