Versione 3 dell'interfaccia operativa DMA
La versione 3 dell'interfaccia operativa DMA è disponibile a partire da Windows 8. La struttura DMA_OPERATIONS per questa interfaccia contiene una serie di nuove routine non definite nelle versioni precedenti di questa interfaccia. Per un elenco delle routine nella versione 3, vedere DMA_OPERATIONS.
Anche se la versione 3 dell'interfaccia operativa DMA è disponibile in tutte le piattaforme hardware Windows, questa interfaccia ha molte funzionalità per consentire ai driver in modalità kernel di usare le funzionalità avanzate dei controller DMA di sistema in sistemi in circuiti integrati Chip (SoC). Queste funzionalità includono in genere la possibilità di eseguire trasferimenti DMA a dispersione/raccolta. Al contrario, le versioni precedenti dell'interfaccia delle operazioni DMA limitano i trasferimenti DMA a dispersione/raccolta ai dispositivi master del bus. L'interfaccia versione 3 semplifica la gestione degli elenchi a dispersione/raccolta e riduce la necessità di intervento del driver durante trasferimenti DMA complessi.
Per usare la versione 3 dell'interfaccia operativa DMA per eseguire un trasferimento DMA, un driver chiama in genere le routine seguenti:
IoGetDmaAdapter
Alloca un oggetto adattatore DMA e restituisce un puntatore a una struttura DMA_ADAPTER che contiene l'interfaccia delle operazioni DMA.
GetDmaTransferInfo
Fornisce una descrizione delle risorse necessarie per eseguire il trasferimento DMA descritto dal chiamante.
AllocateAdapterChannelEx
Alloca le risorse necessarie per il trasferimento DMA e assegna queste risorse all'oggetto adattatore DMA.
MapTransferEx
Inizializza i registri della mappa e il buffer scatter/gather per il trasferimento DMA e avvia il trasferimento.
FlushAdapterBuffersEx
Esegue tutte le operazioni della cache che potrebbero essere necessarie alla fine del trasferimento DMA.
FreeAdapterChannel
Libera il canale DMA e i registri delle mappe.
PutDmaAdapter
Rilascia l'oggetto adapter.
Queste routine vengono usate sia per i dispositivi bus-master che usano controller DMA dedicati che per i dispositivi subordinati che condividono un controller DMA di sistema. Per una descrizione dettagliata delle chiamate effettuate da un driver durante un trasferimento DMA tipico, vedere Modello di chiamata di base per routine DMA versione 3.
Nota Nella versione 3 dell'interfaccia operativa DMA, le chiamate alla routine KeFlushIoBuffers non sono necessarie prima o dopo i trasferimenti DMA. Il motivo è che le routine seguenti coprono la necessità di scaricare cache di dati su piattaforme che non applicano la coerenza della cache nell'hardware:
- MapTransferEx garantisce che le cache dei dati del processore vengano scaricate prima dei trasferimenti di scrittura (da memoria a dispositivo).
- FlushAdapterBuffersEx garantisce che le cache vengano invalidate dopo i trasferimenti di lettura (da dispositivo a memoria).
In un processore x86 o x64, la chiamata KeFlushIoBuffers non esegue alcuna operazione e questa chiamata, se non necessaria, non interferisce con il funzionamento della piattaforma hardware. In un processore Arm, le chiamate a KeFlushIoBuffers durante i trasferimenti DMA eseguono operazioni della cache non necessarie e possono compromettere le prestazioni.