Condividi tramite


Uso di DMA del sistema basato su pacchetti

I driver di dispositivi subordinati che usano DMA basato su pacchetti chiamano la sequenza generale di routine di supporto seguenti durante l'elaborazione di un IRP che richiede un trasferimento DMA:

  • KeFlushIoBuffers poco prima di tentare di allocare il controller DMA di sistema (per altre informazioni, vedere Gestione della coerency della cache)

  • AllocateAdapterChannel quando il driver è pronto per programmare il dispositivo per DMA e necessita del controller DMA di sistema

    AllocateAdapterChannel, a sua volta, chiama la routine AdapterControl del driver.

  • MmGetMdlVirtualAddress per ottenere un indice nel file MDL, obbligatorio come parametro nella chiamata iniziale a MapTransfer

  • MapTransfer per programmare il controller DMA di sistema per l'operazione di trasferimento

    Un driver potrebbe dover chiamare MapTransfer più volte per trasferire tutti i dati richiesti, come illustrato in Suddivisione delle richieste di trasferimento.

  • FlushAdapterBuffers subito dopo ogni operazione di trasferimento DMA da/verso il dispositivo subordinato

    Se un driver deve chiamare MapTransfer più volte per trasferire tutti i dati richiesti, deve chiamare FlushAdapterBuffers quante volte chiama MapTransfer.

  • FreeAdapterChannel non appena tutti i dati richiesti sono stati trasferiti o se il driver non riesce a causa di un errore di I/O del dispositivo

Il puntatore all'oggetto adapter restituito da IoGetDmaAdapter è un parametro obbligatorio per ognuna di queste routine, ad eccezione di KeFlushIoBuffers e MmGetMdlVirtualAddress, che richiedono il puntatore al MDL passato in Irp-MdlAddress>.

I singoli driver chiamano questa sequenza di routine di supporto in punti diversi, a seconda del modo in cui ogni driver viene implementato per il servizio del dispositivo. Ad esempio, la routine StartIo di un driver potrebbe effettuare la chiamata a AllocateAdapterChannel, un altro driver potrebbe effettuare questa chiamata da una routine che rimuove i runtime di integrazione da una coda interlock creata dal driver e un altro driver potrebbe effettuare questa chiamata quando il dispositivo DMA subordinato indica che è pronto per il trasferimento dei dati.