Bagikan melalui


Run-Down Perlindungan

Driver mode kernel dapat menggunakan perlindungan run-down untuk mengakses objek dengan aman dalam memori sistem bersama yang dibuat dan dihapus oleh driver mode kernel lain.

Objek dikatakan habis jika semua akses yang tertunda selesai dan tidak ada permintaan akses baru yang akan diberikan. Misalnya, objek bersama mungkin perlu dijalankan ke bawah sehingga dapat dihapus dan diganti dengan objek baru.

Driver yang memiliki objek bersama dapat memungkinkan driver lain untuk memperoleh dan melepaskan perlindungan run-down pada objek. Ketika perlindungan run-down berlaku, driver selain pemilik dapat mengakses objek tanpa risiko pemilik menghapus objek sebelum akses selesai. Sebelum akses dimulai, driver yang mengakses meminta perlindungan run-down pada objek. Untuk objek berumur panjang, permintaan ini hampir selalu diberikan. Setelah akses selesai, driver mengakses melepaskan perlindungan keamanan terakhir yang diperolehnya pada objek.

Rutinitas perlindungan run-down utama

Untuk mulai berbagi objek, driver yang memiliki objek memanggil ExInitializeRundownProtection rutin untuk menginisialisasi perlindungan run-down pada objek. Setelah panggilan ini, driver lain yang mengakses objek dapat memperoleh dan melepaskan perlindungan run-down pada objek.

Driver yang mengakses objek bersama memanggil rutin ExAcquireRundownProtection untuk meminta perlindungan penghentian pada objek. Setelah akses selesai, driver ini memanggil rutinitas ExReleaseRundownProtection untuk merilis perlindungan run-down pada objek.

Jika driver pemilik menentukan bahwa objek berbagi harus dihapus, driver ini menunggu untuk menghapus objek tersebut sampai semua akses objek yang belum selesai selesai.

Sebagai persiapan untuk menghapus objek bersama, driver pemilik memanggil rutinitas ExWaitForRundownProtectionRelease untuk menunggu penyelesaian proses objek. Selama panggilan ini, ExWaitForRundownProtectionRelease menunggu agar semua instance perlindungan rundown yang telah diberikan sebelumnya pada objek dilepaskan, tetapi mencegah pemberian permintaan baru untuk perlindungan rundown pada objek tersebut. Setelah akses terakhir yang dilindungi selesai dan semua instans perlindungan run-down dirilis, ExWaitForRundownProtectionRelease kembali, dan driver pemilik dapat menghapus objek dengan aman.

ExWaitForRundownProtectionRelease memblokir eksekusi utas driver panggilan hingga semua driver yang menyimpan perlindungan run-down pada objek bersama melepaskan perlindungan ini. Untuk mencegah ExWaitForRundownProtectionRelease memblokir eksekusi untuk jangka waktu yang terlalu lama, utas driver yang mengakses objek bersama harus menghindari ditangguhkan saat mereka menahan perlindungan run-down pada objek. Untuk alasan ini, mengakses driver harus memanggil ExAcquireRundownProtection dan ExReleaseRundownProtection dalam wilayah penting atau wilayah yang dijaga, atau saat berjalan di IRQL = APC_LEVEL.

Penggunaan untuk perlindungan terhadap pengosongan baterai

Perlindungan run-down berguna untuk menyediakan akses ke objek bersama yang hampir selalu tersedia tetapi terkadang perlu dihapus dan diganti. Driver yang mengakses data atau yang memanggil rutinitas dalam objek ini tidak boleh mencoba mengakses objek setelah dihapus. Jika tidak, akses yang tidak valid ini dapat menyebabkan perilaku yang tidak dapat diprediksi, kerusakan data, atau bahkan kegagalan sistem.

Misalnya, driver antivirus biasanya tetap dimuat dalam memori saat sistem operasi berjalan. Terkadang, driver ini mungkin perlu dibongkar dan diganti dengan rilis driver yang diperbarui. Driver lain mengirim permintaan I/O ke driver antivirus untuk mengakses data dan rutinitas dalam driver ini. Sebelum mengirim permintaan I/O, komponen kernel seperti manajer filter sistem file dapat memperoleh perlindungan penghentian untuk mencegah pembongkaran driver antivirus sebelum waktunya saat menangani permintaan I/O. Setelah permintaan I/O selesai, perlindungan run-down dapat dirilis.

Perlindungan penghentian tidak men-serialkan akses ke objek yang digunakan bersama. Jika dua atau lebih driver yang mengakses dapat secara bersamaan mempertahankan perlindungan penghentian pada objek, dan akses ke objek harus dilakukan secara berurutan, beberapa mekanisme lain, seperti penguncian pengecualian, harus digunakan agar akses dilakukan secara berurutan.

Struktur EX_RUNDOWN_REF

Struktur EX_RUNDOWN_REF melacak status perlindungan run-down pada objek bersama. Struktur ini tidak jelas bagi pengemudi. Prosedur perlindungan run-down yang disediakan oleh sistem menggunakan struktur ini untuk menghitung jumlah kasus perlindungan run-down yang saat ini berlaku pada objek. Rutinitas ini juga menggunakan struktur ini untuk melacak apakah objek sudah aus atau sedang dalam proses keausan.

Untuk mulai berbagi objek, driver yang memiliki objek memanggil ExInitializeRundownProtection untuk menginisialisasi struktur EX_RUNDOWN_REF yang terkait dengan objek. Setelah inisialisasi, driver pemilik dapat membuat struktur ini tersedia untuk driver lain yang memerlukan akses ke objek. Driver yang mengakses meneruskan struktur ini sebagai parameter ke panggilan fungsi ExAcquireRundownProtection dan ExReleaseRundownProtection yang memperoleh dan melepaskan perlindungan run-down pada objek. Driver pemilik meneruskan struktur ini sebagai parameter ke dalam panggilan ExWaitForRundownProtectionRelease yang menunggu hingga objek selesai diproses sehingga dapat dihapus dengan aman.

Perbandingan dengan kunci

Perlindungan run-down adalah salah satu dari beberapa cara untuk menjamin akses aman ke objek bersama. Pendekatan lain adalah menggunakan kunci perangkat lunak pengecualian bersama. Jika driver memerlukan akses ke objek yang saat ini dikunci oleh driver lain, driver pertama harus menunggu driver kedua melepaskan kunci. Namun, memperoleh dan melepaskan kunci dapat menjadi hambatan performa, dan kunci dapat mengonsumsi memori dalam jumlah besar. Jika salah digunakan, kunci dapat menyebabkan driver yang bersaing untuk objek bersama yang sama menjadi kebuntuan. Upaya untuk mendeteksi dan menghindari kebuntuan biasanya memerlukan pengalihan sumber daya komputasi yang substansial.

Berbeda dengan kunci, perlindungan run-down memiliki waktu pemrosesan dan persyaratan memori yang relatif ringan. Jumlah referensi sederhana dikaitkan dengan objek untuk memastikan bahwa penghapusan objek ditunda hingga semua akses yang belum selesai pada objek tersebut selesai. Dengan pendekatan ini, instruksi perangkat keras atomik dan saling terkunci dapat digunakan alih-alih kunci perangkat lunak pengecualian timbal balik untuk menjamin akses aman ke objek. Panggilan untuk memperoleh dan merilis perlindungan run-down biasanya cepat. Manfaat menggunakan mekanisme ringan, seperti perlindungan penurunan performa, dapat signifikan untuk objek bersama yang memiliki umur panjang dan dibagikan di antara banyak pengemudi.

Rutinitas perlindungan penurunan daya lainnya

Beberapa rutinitas perlindungan yang sudah usang lainnya tersedia, selain yang telah disebutkan sebelumnya. Rutinitas tambahan ini mungkin digunakan oleh beberapa driver.

Rutinitas ExReInitializeRundownProtection memungkinkan struktur EX_RUNDOWN_REF yang sebelumnya digunakan untuk dikaitkan dengan objek baru, dan menginisialisasi perlindungan run-down pada objek ini.

ExRundownCompleted rutin memperbarui struktur EX_RUNDOWN_REF untuk menunjukkan bahwa eksekusi objek terkait telah selesai.

Rutinitas ExAcquireRundownProtectionEx dan ExReleaseRundownProtectionEx mirip dengan ExAcquireRundownProtection dan ExReleaseRundownProtection. Keempat rutinitas ini bertambah atau mengurangi jumlah instans perlindungan run-down yang berlaku pada objek bersama. Sedangkan ExAcquireRundownProtection dan ExReleaseRundownProtection menaikkan dan menurunkan hitungan ini dengan satu, ExAcquireRundownProtectionEx dan ExReleaseRundownProtectionEx menaikkan dan menurunkan hitungan dengan jumlah sembarang.

Perlindungan terhadap penghentian yang memperhatikan cache

Referensi rundown adalah struktur data yang ringkas dan cepat, tetapi dapat menyebabkan persaingan cache ketika banyak prosesor mencoba memperoleh referensi pada saat yang sama. Hal ini dapat memengaruhi performa dan skalabilitas driver Anda.

Untuk menghindari masalah ini, Anda dapat menggunakan rundown reference yang dapat mengelola cache secara efektif untuk mendistribusikan pelacakan referensi di beberapa baris cache. Ini mengurangi perebutan cache dan meningkatkan performa driver Anda pada komputer multiprosesor.

Untuk menggunakan acuan rundown yang mendukung cache, ikuti langkah-langkah berikut:

  1. Buat objek EX_RUNDOWN_REF_CACHE_AWARE dengan melakukan salah satu hal berikut ini:
  2. Minta perlindungan rundown pada objek sebelum mengaksesnya dengan memanggil rutinitas ExAcquireRundownProtectionCacheAware. Rutinitas ini mengembalikan TRUE jika permintaan dikabulkan, atau FALSE jika objek sedang dihentikan.
  3. Lepaskan perlindungan rundown pada objek setelah mengaksesnya dengan memanggil rutin ExReleaseRundownProtectionCacheAware.
  4. Tunggu hingga objek habis sebelum menghapusnya dengan memanggil rutinitas ExWaitForRundownProtectionReleaseCacheAware. Rutinitas ini memblokir utas yang sedang berjalan hingga semua instans perlindungan rundown pada objek tersebut dilepaskan.
  5. Jika driver memanggil ExAllocateCacheAwareRundownProtection sebelumnya, maka harus memanggil ExFreeCacheAwareRundownProtection untuk membebaskan referensi rundown.

Untuk menggunakan kembali referensi rundown yang mengetahui cache, ikuti langkah-langkah berikut:

  1. Setelah memanggil ExWaitForRundownProtectionReleaseCacheAware, panggil ExRundownCompletedCacheAware untuk menunjukkan bahwa eksekusi objek lama telah selesai.
  2. Panggil ExReInitializeRundownProtectionCacheAware untuk menginisialisasi ulang referensi setelah objek terkait dijalankan.
  3. Sekarang driver dapat kembali memanggil ExAcquireRundownProtectionCacheAware.

Referensi rundown yang memperhatikan cache memiliki keuntungan dalam performa dan skalabilitas yang lebih baik dalam situasi tertentu, tetapi mengonsumsi lebih banyak memori daripada referensi rundown biasa. Anda harus mempertimbangkan kompromi ini saat memilih antara dua jenis referensi ikhtisar.