Share via


Uso di I/O diretto con DMA

La figura seguente illustra come il gestore di I/O configura una richiesta di IRP_MJ_READ per un'operazione di trasferimento DMA che usa operazioni di I/O dirette.

diagramma che illustra l'i/o diretto nei buffer utente per i dispositivi che usano dma.

La figura precedente illustra come i driver possono usare MdlAddress di IRP per trasferire i dati per una richiesta di lettura. Il driver nella figura usa il sistema basato su pacchetti o DMA bus-master e ha ORed i flag dell'oggetto dispositivo con DO_DIRECT_IO.

  1. Alcuni indirizzi virtuali dello spazio utente rappresentano il buffer del thread corrente e il contenuto del buffer potrebbe essere effettivamente archiviato in un certo numero di pagine fisicamente non contigue (ombreggiatura scura nella figura precedente). Il gestore di I/O crea un MDL per descrivere questo buffer. Un MDL è una struttura di dati opaca, definita dal gestore della memoria, che esegue il mapping di un determinato intervallo di indirizzi virtuali a uno o più intervalli di indirizzi fisici basati su pagina. Per altre informazioni, vedere Using MDLs.For more information, see Using MDLs.

  2. Il gestore di I/O esegue la richiesta di lettura del thread corrente, per cui il thread passa un intervallo di indirizzi virtuali dello spazio utente che rappresentano un buffer.

  3. Il gestore di I/O o il driver del file system (FSD) controlla il buffer fornito dall'utente per l'accessibilità e chiama MmProbeAndLockPages con il file MDL creato in precedenza. MmProbeAndLockPages compila anche l'intervallo di indirizzi fisici corrispondente nel file MDL.

    Come illustrato nella figura precedente, un MDL per un intervallo virtuale può avere diverse voci di indirizzi fisici basate su pagina corrispondenti e l'intervallo virtuale per un buffer potrebbe iniziare e terminare in corrispondenza di un offset di byte dall'inizio della prima e dell'ultima pagina descritta da un MDL.

  4. Il gestore di I/O fornisce un puntatore al MDL (MdlAddress) in un IRP che richiede un'operazione di trasferimento. Fino a quando il gestore di I/O o il file system chiama MmUnlockPages dopo che il driver completa l'IRP, le pagine fisiche descritte nel file MDL rimangono bloccate e assegnate al buffer. Tuttavia, gli indirizzi virtuali in un MDL possono diventare invisibili (e non validi), anche prima che l'IRP venga inviato al driver di dispositivo o a qualsiasi driver intermedio che potrebbe essere sovrapposto sopra il driver di dispositivo.

  5. Se il driver usa il sistema basato su pacchetti o DMA master del bus, la routine AdapterControl chiama MmGetMdlVirtualAddress con il puntatore MdlAddress di IRP per ottenere l'indirizzo virtuale di base per le voci basate su pagina di MDL.

  6. La routine AdapterControl chiama quindi MapTransfer con l'indirizzo di base restituito da MmGetMdlVirtualAddress per leggere i dati dal dispositivo direttamente nella memoria fisica. Per altre informazioni, vedere Oggetti adapter e DMA.

I driver devono sempre controllare le lunghezze del buffer. Si noti che il gestore di I/O non crea un MDL per un buffer di lunghezza zero.