Condividi tramite


Uso di Packet-Based Bus-Master DMA

Per usare DMA basato su pacchetti, i driver dei dispositivi DMA master del bus chiamano la seguente sequenza generale di routine di supporto durante l'elaborazione di un IRP che richiede un trasferimento DMA:

  • KeFlushIoBuffers poco prima di tentare di allocare registri mappa per una richiesta di trasferimento (per altre informazioni, vedere Gestione della coescenza della cache)

  • AllocateAdapterChannel quando il driver è pronto per programmare l'adattatore bus-master per DMA

  • MmGetMdlVirtualAddress per ottenere un indice nel file MDL, richiesto come parametro iniziale per MapTransfer e MapTransfer per rendere la memoria fisica del sistema che esegue il backup accessibile dal dispositivo buffer dell'IRP

    Si noti che qualsiasi driver potrebbe dover eseguire più di un'operazione di trasferimento per soddisfare l'IRP corrente, come illustrato in Suddivisione delle richieste di trasferimento. I driver di dispositivi che non dispongono di funzionalità di dispersione/raccolta possono chiamare MapTransfer una volta per ogni operazione di trasferimento. I driver di dispositivi con funzionalità di dispersione/raccolta possono chiamare MapTransfer più volte per configurare ogni operazione di trasferimento. In alternativa, questi driver possono usare il supporto predefinito di dispersione/raccolta del sistema, descritto in Uso di DMA a dispersione/raccolta.

  • FlushAdapterBuffers alla fine di ogni operazione di trasferimento DMA verso/dal dispositivo di destinazione, per determinare se tutti i dati richiesti sono stati completamente trasferiti

  • FreeMapRegisters non appena vengono eseguite tutte le operazioni DMA per l'IRP corrente, perché tutti i dati richiesti sono stati completamente trasferiti o perché il driver deve non riuscire l'IRP a causa di un errore di I/O del dispositivo o del bus

Il puntatore a oggetti adapter restituito da IoGetDmaAdapter è un parametro obbligatorio per AllocateAdapterChannel, MapTransfer, FlushAdapterBuffers e FreeMapRegisters. Si noti che nelle versioni di Windows NT precedenti a Windows 2000 i dispositivi bus-master potrebbero passare un puntatore a un oggetto adattatore NULL a MapTransfer e FlushAdapterBuffers. In Windows 2000 e versioni successive i driver non possono più farlo.

KeFlushIoBuffers e MmGetMdlVirtualAddress richiedono un puntatore al file MDL 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 gestire il dispositivo. Ad esempio, la routine StartIo di un driver potrebbe effettuare la chiamata a AllocateAdapterChannel, mentre un altro driver potrebbe effettuare questa chiamata da una routine che rimuove i runtime di integrazione da una coda interlock creata dal driver o da una coda del dispositivo.

Invece di usare le routine descritte in questa sezione, qualsiasi driver che usa DMA basato su pacchetti può usare routine di supporto destinate a semplificare dMA a dispersione/raccolta, indipendentemente dal fatto che il dispositivo disponga del supporto predefinito di dispersione/raccolta. Per informazioni dettagliate, vedere Uso di DMA a dispersione/gather .