Deteksi kerusakan memori kumpulan khusus di Pemverifikasi Driver
Kerusakan memori adalah masalah driver umum. Kesalahan driver dapat mengakibatkan crash jauh setelah kesalahan dibuat. Kesalahan yang paling umum adalah mengakses memori yang telah dibebaskan, dan mengalokasikan n byte lalu mengakses n+1 byte.
Untuk mendeteksi kerusakan memori, Driver Verifier dapat mengalokasikan memori driver dari kumpulan khusus dan memantau kumpulan tersebut untuk akses yang salah. Dukungan kumpulan khusus disediakan untuk rutinitas yang disediakan sistem mode kernel, seperti ExAllocatePoolWithTag dan juga untuk rutinitas yang disediakan sistem GDI, seperti EngAllocMem.
Kumpulan khusus menurut perataan
Tersedia dua penyelarasan kumpulan khusus:
- Penyelarasan Verifikasi Mulai lebih baik dalam mendeteksi underrun akses.
- Penyelarasan Verifikasi Akhir lebih baik dalam mendeteksi overrun akses.
Untuk informasi selengkapnya tentang cara menggunakan opsi Verifikasi Mulai dan Verifikasi Akhir , lihat Mendeteksi Overruns dan Underruns. Perhatikan bahwa sebagian besar kerusakan memori disebabkan oleh overrun, bukan underruns.
Ketika fitur Kumpulan Khusus aktif dan Verifikasi Akhir telah dipilih, setiap alokasi memori yang diminta oleh driver ditempatkan pada halaman terpisah. Alamat setingkat mungkin yang memungkinkan alokasi agar pas pada halaman dikembalikan, sehingga memori selaras dengan akhir halaman. Bagian sebelumnya dari halaman ditulis dengan pola khusus. Halaman sebelumnya dan halaman berikutnya ditandai tidak dapat diakses.
Jika driver mencoba mengakses memori setelah akhir alokasi, Driver Verifier akan segera mendeteksinya, dan akan mengeluarkan Bug Check 0xCD. Jika driver menulis dalam memori sebelum awal buffer, ini akan (mungkin) mengubah pola. Ketika buffer dikosongkan, Driver Verifier akan mendeteksi perubahan dan mengeluarkan Bug Check 0xC1.
Jika driver membaca atau menulis ke buffer setelah membebaskannya, Driver Verifier akan mengeluarkan Bug Check 0xCC.
Saat Verifikasi Mulai dipilih, buffer memori diratakan dengan awal halaman. Dengan pengaturan ini, underruns menyebabkan pemeriksaan bug langsung dan overruns menyebabkan pemeriksaan bug ketika memori dikosongkan. Opsi ini jika tidak identik dengan opsi Verifikasi Akhir .
Verifikasi Akhir adalah perataan default, karena kesalahan yang diserbu jauh lebih umum dalam driver daripada kesalahan underrun.
Alokasi memori individual dapat mengganti pengaturan ini dan memilih perataannya dengan memanggil ExAllocatePoolWithTagPriority dengan parameter Prioritas yang diatur ke XxxSpecialPoolOverrun atau XxxSpecialPoolUnderrun. (Rutinitas ini tidak dapat mengaktifkan atau menonaktifkan fitur Kumpulan Khusus, atau meminta kumpulan khusus untuk alokasi memori, yang sebaliknya akan dialokasikan dari kumpulan normal. Hanya penyelarasan yang dapat dikontrol dari rutinitas ini.)
Di Windows 7 dan versi yang lebih baru dari sistem operasi Windows, opsi Kumpulan Khusus mendukung memori yang dialokasikan dengan menggunakan API kernel berikut:
IoAllocateIrp dan rutinitas lainnya yang dapat mengalokasikan struktur data paket permintaan I/O (IRP)
RtlAnsiStringToUnicodeString dan rutinitas string pustaka run-time (RTL) lainnya
Kumpulan khusus menurut tag kumpulan atau ukuran alokasi
Selain fitur Kumpulan Khusus Driver Verifier, yang meminta kumpulan khusus untuk alokasi oleh driver tertentu, ada dua cara lain untuk menggunakan kumpulan khusus:
Tag kumpulan. Minta kumpulan khusus untuk semua alokasi dengan tag kumpulan tertentu.
Ukuran. Minta kumpulan khusus untuk semua alokasi dalam rentang ukuran tertentu.
Untuk meminta kumpulan khusus untuk tag kumpulan atau rentang ukuran, gunakan Gflags, alat yang disertakan dalam Alat Debugging untuk Windows. Untuk detailnya, lihat Menggunakan Utilitas Bendera Global.
Anda dapat menggunakan fitur Kumpulan Khusus Driver Verifier dan fitur kolam khusus Gflags secara bersamaan. Jika Anda melakukannya, ingatlah bahwa kumpulan khusus terbatas, bahwa tidak semua upaya untuk mengalokasikan dari kumpulan khusus berhasil, dan bahwa Windows mengembalikan status keberhasilan untuk upaya yang gagal untuk mengalokasikan dari kumpulan khusus yang dipenuhi oleh alokasi dari kumpulan memori reguler.
Efisiensi kumpulan khusus
Tidak semua permintaan kumpulan khusus terpenuhi. Setiap alokasi dari kumpulan khusus menggunakan satu halaman memori fisik yang tidak dapat dimanfaatkan dan dua halaman ruang alamat virtual. Jika kumpulan habis, memori dialokasikan dengan cara standar sampai kumpulan khusus tersedia lagi. Ketika permintaan kumpulan khusus diisi dari kumpulan standar, fungsi yang meminta tidak mengembalikan kesalahan, karena permintaan kumpulan telah berhasil. Dengan demikian, tidak disarankan agar beberapa driver diverifikasi pada saat yang sama jika fitur Kumpulan Khusus diaktifkan.
Satu driver yang membuat banyak permintaan memori kecil juga dapat menguras kumpulan ini. Jika ini terjadi, mungkin lebih baik menetapkan tag kumpulan ke alokasi memori driver dan mendedikasikan kumpulan khusus untuk satu tag kumpulan pada satu waktu.
Ukuran kumpulan khusus meningkat dengan jumlah memori fisik pada sistem; idealnya ini harus setidaknya 1 Gigabyte (GB). Pada komputer x86, karena ruang virtual (selain fisik) digunakan, jangan gunakan opsi boot /3GB . Ada baiknya juga untuk meningkatkan jumlah minimum/maksimum pagefile dengan faktor dua atau tiga.
Untuk memastikan bahwa semua alokasi pengemudi sedang diuji, menekankan pengemudi selama jangka waktu yang lama disarankan.
Memantau kumpulan khusus
Statistik yang berkaitan dengan alokasi kumpulan dapat dipantau. Ini dapat ditampilkan oleh Driver Verifier Manager, baris perintah Verifier.exe, atau dalam file log. Lihat Memantau Penghitung Global untuk detailnya.
Jika Alokasi Kumpulan Berhasil di penghitung Kumpulan Khusus sama dengan penghitung Alokasi Kumpulan Berhasil , maka kumpulan khusus telah cukup untuk mencakup semua alokasi memori. Jika penghitung sebelumnya lebih rendah dari yang terakhir, maka kumpulan khusus telah habis setidaknya sekali.
Penghitung ini tidak melacak alokasi yang ukurannya satu halaman atau lebih besar, karena kumpulan khusus tidak berlaku untuk mereka.
Jika fitur Kumpulan Khusus diaktifkan, tetapi kurang dari 95% dari semua alokasi kumpulan telah ditetapkan dari kumpulan khusus, peringatan akan muncul di Driver Verifier Manager. Di Windows 2000, peringatan ini akan muncul di layar Status Driver . Di Windows XP dan yang lebih baru, peringatan ini akan muncul di layar Penghitung Global . Jika ini terjadi, Anda harus memverifikasi daftar driver yang lebih pendek, memverifikasi kumpulan individual berdasarkan tag kumpulan, atau menambahkan lebih banyak memori fisik ke sistem Anda.
Ekstensi debugger kernel !verifier juga dapat digunakan untuk memantau penggunaan kumpulan khusus. Ini menyajikan informasi yang mirip dengan Driver Verifier Manager. Untuk informasi tentang ekstensi debugger, lihat Penelusuran Kesalahan Windows.
Mengaktifkan opsi kumpulan khusus
Anda dapat mengaktifkan fitur Kumpulan Khusus untuk satu atau beberapa driver dengan menggunakan Driver Verifier Manager atau baris perintah Verifier.exe. Untuk detailnya, lihat Memilih Opsi Pemverifikasi Driver.
Catatan
Untuk mengaktifkan fitur Kumpulan Khusus menurut tag kumpulan atau ukuran alokasi, atau untuk mengatur penyelarasan Verifikasi Mulai (deteksi underrun) dan Verifikasi Akhir (deteksi overrun), gunakan utilitas Bendera Global; pengaturan perataan ini berlaku untuk semua alokasi kumpulan khusus.
Pada baris perintah
Pada baris perintah, opsi Kumpulan Khusus diwakili oleh Bit 0 (0x1). Untuk mengaktifkan Kumpulan Khusus, gunakan nilai bendera 0x1 atau tambahkan 0x1 ke nilai bendera. Contohnya:
verifier /flags 0x1 /driver MyDriver.sys
Fitur ini akan aktif setelah boot berikutnya.
Anda juga dapat mengaktifkan dan menonaktifkan Kumpulan Khusus tanpa me-reboot komputer dengan menambahkan parameter /volatile ke perintah . Contohnya:
verifier /volatile /flags 0x1 /adddriver MyDriver.sys
Pengaturan ini segera efektif, tetapi hilang ketika Anda mematikan atau me-reboot komputer. Untuk detailnya, lihat Menggunakan Pengaturan Volatil.
Fitur Kumpulan Khusus juga disertakan dalam pengaturan standar. Contohnya:
verifier /standard /driver MyDriver.sys
Menggunakan Driver Verifier Manager
- Pilih Buat pengaturan kustom (untuk pengembang kode) lalu klik Berikutnya.
- Pilih Pilih pengaturan individual dari daftar lengkap.
- Pilih (centang) Kumpulan khusus.
Fitur Kumpulan Khusus juga disertakan dalam pengaturan standar. Untuk menggunakan fitur ini, di Driver Verifier Manager, klik Buat Pengaturan Standar.