Condividi tramite


Uso di Common-Buffer Bus-Master DMA

Come descritto in Uso di Bus-Master DMA, alcuni driver per i dispositivi DMA master del bus usano esclusivamente DMA common-buffer e alcuni usano DMA common-buffer in combinazione con DMA basato su pacchetti.

Usare DMA common-buffer economicamente. La configurazione di un buffer comune può riordinare alcuni (o tutti, a seconda delle dimensioni del buffer richiesto) dei registri mappa associati all'oggetto adapter che rappresenta l'adattatore master del bus.

La configurazione di aree di buffer comuni, ad esempio usando blocchi PAGE_SIZE o una singola allocazione, lascia più registri mappa disponibili per le operazioni DMA basate su pacchetti. Lascia anche più memoria di sistema libera per altri scopi, che produce migliori prestazioni complessive del driver e del sistema.

Per configurare un buffer comune per DMA bus master, un driver di dispositivo DMA master del bus deve chiamare AllocateCommonBuffer con il puntatore a oggetti adattatore restituito da IoGetDmaAdapter. In genere, un driver effettua questa chiamata dalla routine DispatchPnP per le richieste di IRP_MN_START_DEVICE . Un driver deve allocare un buffer comune solo se userà ripetutamente il buffer per le operazioni DMA mentre il driver rimane caricato. Il diagramma seguente illustra una chiamata di questo tipo a AllocateCommonBuffer.

diagramma che illustra l'allocazione di un buffer comune per dma master del bus.

Le dimensioni richieste per il buffer, visualizzate nel diagramma precedente come LengthForBuffer, determina il numero di registri mappa da usare per fornire un mapping virtuale a logica per il buffer comune. Usare la macro BYTES_TO_PAGES per determinare il numero massimo di pagine necessarie (BYTES_TO_PAGES (LengthForBuffer). Questo valore non può essere maggiore di NumberOfMapRegisters restituito da IoGetDmaAdapter.

Inoltre, il chiamante deve fornire quanto segue:

  • Valore booleano che indica se la memorizzazione nella cache deve essere abilitata

    Nota Questo valore 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.

    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.

  • Puntatore a una variabile definita dal driver che conterrà l'indirizzo logico di base accessibile dal dispositivo per il buffer (BufferLogicalAddress nel diagramma precedente) restituito da AllocateCommonBuffer

Se la chiamata ha esito positivo, AllocateCommonBuffer restituisce un indirizzo virtuale di base accessibile dal driver per il buffer (BufferVirtualAddress nel diagramma precedente), che il driver deve salvare nell'estensione del dispositivo, nell'estensione del controller o in un'altra area di archiviazione residente accessibile da driver (pool non a pagina allocato dal driver).

AllocateCommonBuffer restituisce NULL se non può allocare memoria per il buffer. Se l'indirizzo virtuale di base restituito è NULL, il driver deve usare il supporto DMA basato su pacchetti del sistema esclusivamente o il driver deve avere esito negativo sulla richiesta di IRP_MN_START_DEVICE , restituendo STATUS_INSUFFICIENT_RESOURCES.

In caso contrario, il driver può usare il buffer comune allocato come area di archiviazione accessibile da driver e adattatore per i trasferimenti DMA.

Quando il gestore PnP invia un'IRP che arresta o rimuove il dispositivo, il driver deve chiamare FreeCommonBuffer per rilasciare ogni buffer comune allocato.