Bagikan melalui


Menggunakan I/O Langsung dengan DMA

Gambar berikut menggambarkan bagaimana manajer I/O menyiapkan permintaan IRP_MJ_READ untuk operasi transfer DMA yang menggunakan I/O langsung.

diagram yang mengilustrasikan i/o langsung pada buffer pengguna untuk perangkat yang menggunakan dma.

Gambar sebelumnya menggambarkan bagaimana driver dapat menggunakan MdlAddress IRP untuk mentransfer data untuk permintaan baca. Driver dalam gambar menggunakan sistem berbasis paket atau DMA master bus, dan memiliki ORed Bendera objek perangkat dengan DO_DIRECT_IO.

  1. Beberapa rentang alamat virtual ruang pengguna mewakili buffer utas saat ini, dan konten buffer tersebut mungkin benar-benar disimpan pada sejumlah halaman yang tidak disukai secara fisik (bayangan gelap pada gambar sebelumnya). Manajer I/O membuat MDL untuk menjelaskan buffer ini. MDL adalah struktur data buram, yang ditentukan oleh manajer memori, yang memetakan rentang alamat virtual tertentu ke satu atau beberapa rentang alamat fisik berbasis halaman. Untuk informasi selengkapnya, lihat Menggunakan MDL.

  2. Manajer I/O melayani permintaan baca utas saat ini, yang utasnya melewati berbagai alamat virtual ruang pengguna yang mewakili buffer.

  3. Manajer I/O atau driver sistem file (FSD) memeriksa buffer yang disediakan pengguna untuk aksesibilitas dan memanggil MmProbeAndLockPages dengan MDL yang dibuat sebelumnya. MmProbeAndLockPages juga mengisi rentang alamat fisik yang sesuai di MDL.

    Seperti yang ditunjukkan oleh gambar sebelumnya, MDL untuk rentang virtual dapat memiliki beberapa entri alamat fisik berbasis halaman yang sesuai, dan rentang virtual untuk buffer mungkin dimulai dan berakhir pada beberapa offset byte dari awal halaman pertama dan terakhir yang dijelaskan oleh MDL.

  4. Manajer I/O menyediakan pointer ke MDL (MdlAddress) dalam IRP yang meminta operasi transfer. Hingga manajer I/O atau sistem file memanggil MmUnlockPages setelah driver menyelesaikan IRP, halaman fisik yang dijelaskan dalam MDL tetap dikunci dan ditetapkan ke buffer. Namun, alamat virtual dalam MDL seperti itu dapat menjadi tidak terlihat (dan tidak valid), bahkan sebelum IRP dikirim ke driver perangkat atau ke driver perantara yang mungkin berlapis di atas driver perangkat.

  5. Jika driver menggunakan sistem berbasis paket atau DMA master bus, rutinitas AdapterControl-nya memanggil MmGetMdlVirtualAddress dengan penunjuk MdlAddress IRP untuk mendapatkan alamat virtual dasar untuk entri berbasis halaman MDL.

  6. Rutinitas AdapterControl kemudian memanggil MapTransfer dengan alamat dasar yang dikembalikan oleh MmGetMdlVirtualAddress, untuk membaca data dari perangkat langsung ke memori fisik. (Untuk informasi selengkapnya, lihat Objek Adapter dan DMA.)

Driver harus selalu memeriksa panjang buffer. Perhatikan bahwa manajer I/O tidak membuat MDL untuk buffer panjang nol.