Condividi tramite


PALLOCATE_COMMON_BUFFER funzione di callback (wdm.h)

La routine AllocateCommonBuffer alloca memoria ed esegue il mapping in modo che sia accessibile simultaneamente sia dal processore che 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 bus-master 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ò tenere conto di 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 da allocare. Tale decisione si basa sull'architettura del processore e sul bus di dispositivo.

Nei computer con processori basati su x86, x64 e basati su Itanium è abilitata la memoria memorizzata nella cache. Si presuppone che tutte le operazioni DMA eseguite da un dispositivo siano coerenti con le cache della CPU pertinenti, che potrebbero memorizzare nella cache tale memoria. Se il driver deve disabilitare la memorizzazione nella cache, chiamare 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.

Osservazioni

allocateCommonBuffer non è una routine di sistema che può essere chiamata direttamente per nome. Questa routine è chiamabile solo dal puntatore dall'indirizzo restituito in una struttura 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 la 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à di inizializzazione automatica di un controller DMA di sistema.

AllocateCommonBuffer esegue le operazioni seguenti:

  • Alloca la memoria che può essere raggiunta sia dal processore che dal dispositivo. Questa memoria viene visualizzata contigua al dispositivo.
  • Alloca i registri delle mappe per eseguire il mapping del buffer, se richiesto dal sistema.
  • Configura una traduzione per il dispositivo, incluso il caricamento dei registri delle mappe, se necessario.
Per usare economicamente la memoria del sistema residente, i driver devono allocare il minor numero possibile di questi buffer per ogni dispositivo. AllocateCommonBuffer alloca almeno una pagina di memoria, indipendentemente dalla lunghezza richiesta. Dopo un'allocazione corretta che richiede meno di PAGE_SIZE byte, il chiamante può accedere solo all'Lunghezza richiesta. Dopo una corretta allocazione 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 più pagine di spazio buffer comune, ma le pagine non devono essere contigue, il driver deve effettuare diverse richieste a una pagina per AllocateCommonBuffer anziché una richiesta di grandi dimensioni. Questo approccio consente di risparmiare 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 solo le richieste di una pagina abbiano esito positivo, se presente.

Fabbisogno

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)

Vedere anche

DMA_ADAPTER

DMA_OPERATIONS

FreeCommonBuffer

IoGetDmaAdapter