Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Verifikasi DMA memantau penggunaan Akses Memori Langsung (DMA). Karena rutinitas DMA telah berubah saat Windows telah berkembang, banyak driver yang salah menggunakan panggilan DMA. Selain itu, beberapa pengembang driver mencoba melewati subsistem HAL DMA secara keseluruhan. Praktik ini dapat memperkenalkan bug berbahaya ke dalam driver.
Opsi Verifikasi DMA dari Driver Verifier mencoba menangkap kesalahan DMA umum. Seiring dengan ekstensi debugger kernel !dma , ini dapat digunakan untuk memverifikasi bahwa driver menggunakan DMA dengan cara yang tepat.
Opsi Pemverifikasi Driver ini juga disebut Verifikasi HAL. Beberapa pesan kesalahan yang dihasilkan oleh Driver Verifier dapat menggunakan istilah ini.
Berbagai Jenis DMA
DMA adalah mekanisme di mana perangkat keras dapat mentransfer data ke atau dari memori tanpa menggunakan prosesor. Prosesor diperlukan untuk menyiapkan transfer, dan perangkat akan memberi sinyal prosesor ketika telah menyelesaikan transfer. Keuntungan dari sistem ini adalah prosesor dapat melakukan tugas lain saat transfer DMA sedang dilakukan.
Ada beberapa jenis DMA yang digunakan di Windows 2000 dan yang lebih baru:
Common-buffer DMA
DMA dengan buffer umum terjadi ketika sistem dapat mengalokasikan satu buffer yang dapat diakses oleh perangkat keras dan perangkat lunak. Driver bertanggung jawab untuk menyinkronkan akses ke buffer. Memori tidak di-cache, sehingga sinkronisasi ini lebih mudah bagi driver. Setelah menyiapkan buffer umum, driver dan perangkat keras dapat menulis langsung ke alamat di buffer tanpa intervensi dari HAL.
Paket DMA
DMA paket dilakukan ketika ada satu buffer yang ada yang harus dipetakan untuk digunakan oleh perangkat keras. Contoh penggunaan DMA paket adalah transfer file dari memori ke disk. Menggunakan common-buffer DMA dalam situasi ini akan menjadi pemborosan, karena file harus ditransfer ke buffer bersama sebelum perangkat keras dapat mentransfernya ke disk. Sebaliknya, HAL dikonsultasikan; ini memberi driver informasi yang diperlukan untuk membantu perangkat keras menemukan buffer aktual dalam memori. Operasi ini rumit oleh kebutuhan akan rutinitas yang terlibat untuk bekerja di berbagai arsitektur.
Menyebarkan/mengumpulkan DMA
Scatter/gather DMA adalah metode pintasan yang menyiapkan beberapa transfer DMA paket sekaligus. Jika Anda mentransfer paket melalui jaringan, misalnya, setiap bagian tumpukan jaringan menambahkan headernya sendiri (TCP, IP, Ethernet, dan sebagainya). Header ini semuanya dialokasikan dari tempat yang berbeda dalam memori. Dalam hal ini, scatter/gather DMA menghemat waktu dengan mengirimkan permintaan batch ke HAL untuk memetakan setiap header dan segmen data agar dapat diakses oleh perangkat keras. Alih-alih harus memanggil rutinitas DMA paket pada setiap bagian paket, metode ini memanggil setiap rutinitas sekali, dan membiarkan HAL bertanggung jawab untuk memetakan masing-masing satu per satu.
CatatanKemampuan sebar/kumpulkan tidak berarti bahwa perangkat dapat menggunakan rutinitas sebar/kumpulkan. Kemampuan sebar/kumpulkan mengacu pada bendera dalam deskripsi perangkat yang menunjukkan bahwa perangkat dapat membaca atau menulis dari area mana pun dalam memori, bukan hanya rentang tertentu.
Sistem DMA
DMA sistem dilakukan dengan memprogram pengontrol DMA sistem pada motherboard untuk melakukan transfer secara langsung. Hanya kartu ISA yang dapat menggunakan DMA sistem.
Efek Verifikasi DMA
Ketika Verifikasi DMA aktif, Driver Verifier mendeteksi penyalahgunaan rutinitas DMA, termasuk:
Memori buffer DMA yang melebihi kapasitas atau di bawah kapasitas (kesalahan ini dapat dilakukan oleh perangkat keras atau oleh driver).
Membebaskan ganda buffer umum, saluran adaptor, daftar peta, atau daftar sebar/kumpulkan.
Membocorkan memori dengan tidak membebaskan buffer umum, saluran adaptor, daftar peta, daftar sebar/kumpulkan, atau adaptor.
Memiliki lebih dari satu saluran adaptor untuk satu adaptor pada satu waktu.
Mencoba menggunakan adaptor yang telah dibebaskan dan tidak ada lagi.
Tidak membersihkan buffer adaptor.
Memiliki terlalu banyak jumlah referensi yang luar biasa untuk adaptor.
Melakukan DMA pada buffer yang dapat dipaging (semua buffer harus dikunci sebelum transfer DMA dimulai).
Melakukan DMA pada MDL dengan indikator yang rusak.
Mereferensikan alamat sistem yang tidak valid, baik sebelum MDL pertama, atau setelah akhir MDL pertama, atau menggunakan panjang transfer yang lebih panjang dari buffer MDL dan melewati batas halaman dalam MDL.
Mengalokasikan terlalu banyak daftar peta pada satu waktu, atau mengalokasikan lebih banyak register peta daripada jumlah maksimum yang diizinkan.
Pemetaan ganda daftar peta.
Berusaha membebaskan register peta sementara beberapa masih dipetakan.
Mencoba untuk menghapus register peta yang belum dipetakan.
Mencoba untuk membuang terlalu banyak byte di akhir file register pemetaan.
Memanggil rutinitas DMA pada IRQL yang salah.
Meneruskan DMA_ADAPTER dengan nilai null ke rutinitas HAL.
Meneruskan alamat dan MDL ke rutinitas HAL ketika alamat tidak termasuk dalam MDL.
Mencoba memetakan rentang alamat yang telah dipetakan.
Mencoba untuk menghapus buffer yang tidak dipetakan.
Sedang mencoba memetakan buffer dengan panjang nol untuk ditransfer.
Memanggil fungsi usang HalGetAdapter (semua driver harus menggunakan IoGetDmaAdapter sebagai gantinya).
Driver Verifier memantau perilaku driver dan mengeluarkan pemeriksaan bug 0xE6 jika salah satu pelanggaran ini terjadi. Lihat Pemeriksaan Bug 0xE6 (DRIVER_VERIFIER_DMA_VIOLATION) untuk daftar dari parameter pemeriksaan bug.
Kapan Verifikasi DMA Berguna?
Semua driver yang menggunakan DMA secara langsung (dengan memanggil rutinitas HAL DMA) harus diuji dengan Verifikasi DMA.
Selain itu, driver miniport juga harus diuji, karena mereka sering menggunakan DMA secara tidak langsung (dengan memanggil driver port yang menggunakan DMA).
Verifikasi DMA juga dapat menjadi cara yang efektif untuk mendeteksi kerusakan memori, karena dapat melihat ketika driver atau perangkat keras menimpa buffer DMA.
Memantau Verifikasi DMA
Ekstensi debugger kernel !dma dapat digunakan untuk menampilkan banyak informasi DMA. Ini dapat menampilkan berbagai detail tentang perilaku setiap adaptor DMA. Ada contoh terperinci dari ekstensi !dma , serta informasi umum tentang ekstensi debugger, dalam dokumentasi dalam paket Alat Debugging untuk Windows. Lihat Penelusuran Kesalahan Windows untuk detailnya.
Mengaktifkan Opsi Ini
Anda dapat mengaktifkan fitur Verifikasi DMA untuk satu atau beberapa driver dengan menggunakan Driver Verifier Manager atau baris perintah Verifier.exe. Untuk detailnya, lihat Memilih Opsi Pemverifikasi Driver.
Pada baris perintah
Pada baris perintah, opsi Verifikasi DMA diwakili oleh Bit 7 (0x80). Untuk mengaktifkan Verifikasi DMA, gunakan nilai bendera 0x80 atau tambahkan 0x80 ke nilai bendera. Contohnya:
verifier /flags 0x80 /driver MyDriver.sysFitur ini akan aktif setelah boot berikutnya.
Pada Windows Vista dan versi Windows yang lebih baru, Anda juga dapat mengaktifkan dan menonaktifkan Verifikasi DMA tanpa me-boot ulang komputer dengan menambahkan parameter /volatil ke perintah . Contohnya:
verifier /volatile /flags 0x80 /adddriver MyDriver.sysPengaturan ini segera efektif, tetapi hilang ketika Anda mematikan atau me-reboot komputer. Untuk detailnya, lihat Menggunakan Pengaturan Volatil.
Fitur Verifikasi DMA juga disertakan dalam pengaturan standar. Contohnya:
verifier /standard /driver MyDriver.sysMenggunakan Pengelola Verifikasi Pengemudi
- Mulai Manajer Verifikasi Driver. Ketik Pemverifikasi di jendela Command Prompt.
- Pilih Buat pengaturan kustom (untuk pengembang kode) lalu klik Berikutnya.
- Pilih Pilih pengaturan individual dari daftar lengkap.
- Pilih (centang) verifikasi DMA.
Fitur Verifikasi DMA juga disertakan dalam pengaturan standar. Untuk menggunakan fitur ini, di Driver Verifier Manager, klik Buat Pengaturan Standar.