Recupero di un oggetto Adapter
All'avvio del dispositivo, un driver che usa il sistema o il DMA master del bus chiama IoGetDmaAdapter per ottenere un puntatore a un oggetto adapter e per determinare il numero massimo di registri mappa disponibili per ogni operazione di trasferimento. Quando un driver chiama IoGetDmaAdapter, gestione I/O, a sua volta, chiama hal per ottenere le informazioni specifiche della piattaforma necessarie.
Un driver deve fornire determinate informazioni in una struttura di DEVICE_DESCRIPTION definita dal sistema nella chiamata a IoGetDmaAdapter. I driver devono usare RtlZeroMemory per inizializzare la struttura DEVICE_DESCRIPTION con zero prima di impostarne i valori.
I dati necessari includono informazioni sulle funzionalità del dispositivo del driver, ad esempio se il dispositivo è un master del bus, se ha funzionalità di dispersione/raccolta e quanti byte di dati il dispositivo può trasferire alla volta (MaximumLength).
I dati di descrizione del dispositivo necessari includono anche informazioni specifiche della piattaforma, ad esempio il numero specifico della piattaforma e assegnato dal sistema del bus che un driver di un dispositivo master del bus controlla. Un driver può ottenere queste informazioni chiamando IoGetDeviceProperty.
La struttura DEVICE_DESCRIPTION include alcuni campi che potrebbero essere irrilevanti per alcuni dispositivi o driver DMA. Ad esempio, il campo BusNumber non viene usato nei driver WDM. Ogni driver deve fornire valori per i membri della struttura pertinenti e deve impostare i valori per tutti gli altri membri su zero.
Il driver di un dispositivo subordinato non deve passare TRUE nel campo ScatterGather , a meno che il dispositivo non sia in grado di attendere che il controller DMA del sistema venga riprogrammato quando una richiesta deve essere suddivisa in due o più operazioni DMA.
IoGetDmaAdapter restituisce sia un puntatore a un oggetto adapter che un valore specifico della piattaforma o specifico del dispositivo che indica il numero di registri mappa disponibili con l'oggetto adapter per ogni operazione di trasferimento DMA.
L'oggetto adapter restituito contiene tre campi accessibili ai driver:
Numero di versione (versione)
Dimensioni (dimensioni)
Puntatore a una struttura DMA_OPERATIONS (DmaOperations)
La struttura DMA_OPERATIONS include una tabella di puntatori per le funzioni che il driver deve usare per eseguire operazioni DMA nel dispositivo. Le funzioni sono accessibili solo tramite i puntatori in questa struttura di dati; un driver non può chiamarli direttamente in base al nome. Si noti che queste routine sostituiscono routine HalXxx supportate nelle versioni precedenti di Windows NT. Per garantire la compatibilità per i driver legacy, i file di intestazione Wdm.h e Ntddk.h forniscono macro con i nomi obsoleti, ma i nuovi driver devono sempre chiamare le funzioni tramite la struttura dei dati.
Il numero di registri mappa può variare da dispositivo a dispositivo e dalla piattaforma alla piattaforma. In genere, hal assegna un numero di registri mappa in base ai criteri seguenti:
Se possibile, hal restituisce un valore maggiore del numero di registri della mappa necessari per trasferire i byte MaximumLength , come specificato nella chiamata del driver a IoGetDmaAdapter.
In caso contrario, hal restituisce un valore minore che è il più grande possibile per la piattaforma specifica.
In altre parole, il HAL offre in genere a ogni driver un numero sufficiente di registrazioni mappa per ottimizzare la velocità effettiva DMA per il dispositivo, ma hal può restituire un valore minore in alcune piattaforme Windows. Non esiste alcuna garanzia che un driver otterrà il numero di richieste di mapping, pertanto i driver devono sempre controllare il valore restituito.
Qualsiasi driver di dispositivo DMA deve fornire archiviazione per il puntatore dell'oggetto adapter e il valore NumberOfMapRegisters restituito da IoGetDmaAdapter. Questo puntatore è un parametro obbligatorio per le routine di supporto fornite dal sistema usate per DMA. Poiché molte di queste routine di supporto devono essere chiamate in IRQL = DISPATCH_LEVEL, l'archiviazione allocata del driver deve essere residente. La maggior parte dei driver DMA fornisce l'archiviazione necessaria in un'estensione del dispositivo. Tuttavia, l'archiviazione può essere in un'estensione del controller se il driver usa anche un oggetto controller o in un pool non a pagine allocato dal driver. Per altre informazioni, vedere Allocazione di System-Space memoria e gestione delle priorità hardware .
Al termine di tutte le operazioni DMA, il driver chiama PutDmaAdapter per liberare l'oggetto adapter.
Le sezioni seguenti Usano System DMA e Using Bus-Master DMA) descrivono come i driver monolitici dei dispositivi DMA usano le routine di supporto per soddisfare le richieste di trasferimento. Queste sezioni presuppongono che il driver abbia quanto segue:
Routine StartIo standard, anziché configurare e gestire una coda interna di IRP
Una routine interna per suddividere le richieste di trasferimento per cui è disponibile un numero insufficiente di registri mappa
Nessun vincolo DMA specifico del dispositivo
In altre parole, queste sezioni descrivono la tecnica più semplice possibile per le operazioni DMA dei driver, ma i singoli driver non usano necessariamente esattamente le stesse tecniche. Per qualsiasi driver di un dispositivo DMA, le routine del driver devono suddividere le richieste di trasferimento DMA di grandi dimensioni dipende dal modello di driver (classe/porta o monolitica), sulle funzionalità del dispositivo e su qualsiasi vincolo DMA specifico del dispositivo che il driver deve gestire.