Bagikan melalui


Menggunakan Packet-Based Bus-Master DMA

Untuk menggunakan DMA berbasis paket, driver perangkat DMA master bus memanggil urutan umum rutinitas dukungan berikut saat mereka memproses IRP yang meminta transfer DMA:

  • KeFlushIoBuffers tepat sebelum mencoba mengalokasikan register peta untuk permintaan transfer (untuk informasi selengkapnya, lihat Mempertahankan Cache Coherency)

  • AlokasikanAdapterChannel ketika pengemudi siap untuk memprogram adaptor bus-master untuk DMA

  • MmGetMdlVirtualAddress untuk mendapatkan indeks ke dalam MDL, diperlukan sebagai parameter awal untuk MapTransfer, dan MapTransfer untuk membuat memori fisik sistem yang mendukung buffer IRP dapat diakses oleh perangkat

    Perhatikan bahwa setiap driver mungkin perlu melakukan lebih dari satu operasi transfer untuk memenuhi IRP saat ini, seperti yang dijelaskan dalam Permintaan Transfer Pemisahan. Driver perangkat yang tidak memiliki kemampuan sebar/kumpulkan dapat memanggil MapTransfer sekali per operasi transfer. Driver perangkat yang memiliki kemampuan menyebarkan/mengumpulkan dapat memanggil MapTransfer lebih dari sekali untuk menyiapkan setiap operasi transfer. Atau, driver ini dapat menggunakan dukungan sebar/kumpulkan bawaan sistem, yang dijelaskan dalam Menggunakan Scatter/Gather DMA.

  • FlushAdapterBuffers di akhir setiap operasi transfer DMA ke/dari perangkat target, untuk menentukan apakah semua data yang diminta telah sepenuhnya ditransfer

  • FreeMapRegisters segera setelah semua operasi DMA untuk IRP saat ini selesai, karena semua data yang diminta telah sepenuhnya ditransfer atau karena driver harus membatalkan IRP karena kesalahan I/O perangkat atau bus

Penunjuk objek adaptor yang dikembalikan oleh IoGetDmaAdapter adalah parameter yang diperlukan untuk AllocateAdapterChannel, MapTransfer, FlushAdapterBuffers, dan FreeMapRegisters. Perhatikan bahwa dalam versi Windows NT sebelum Windows 2000, perangkat master bus dapat meneruskan penunjuk objek adaptor NULL ke MapTransfer dan FlushAdapterBuffers. Di Windows 2000 dan yang lebih baru, driver tidak dapat lagi melakukannya.

KeFlushIoBuffers dan MmGetMdlVirtualAddress memerlukan penunjuk ke MDL di Irp-MdlAddress>.

Driver individu memanggil urutan rutinitas dukungan ini di titik yang berbeda, tergantung pada bagaimana setiap driver diimplementasikan untuk melayani perangkatnya. Misalnya, rutinitas StartIo satu driver mungkin melakukan panggilan ke AllocateAdapterChannel, sementara driver lain mungkin melakukan panggilan ini dari rutinitas yang mengambil IRPs dari antrean yang dibuat oleh driver, baik itu antrean perangkat atau antar muka yang saling terkunci.

Alih-alih menggunakan rutinitas yang dijelaskan di bagian ini, driver apa pun yang menggunakan DMA berbasis paket dapat menggunakan rutinitas dukungan yang dimaksudkan untuk menyederhanakan sebar/mengumpulkan DMA, terlepas dari apakah perangkatnya memiliki dukungan sebar/kumpulkan bawaan. Lihat Menggunakan Scatter/Gather DMA untuk detailnya.