Perlindungan Run-Down

Dimulai dengan Windows XP, perlindungan run-down tersedia untuk driver mode kernel. Driver 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 akan dijalankan jika semua akses objek yang beredar selesai dan tidak ada permintaan baru untuk mengakses objek 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 bahwa pemilik akan 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 yang mengakses merilis perlindungan run-down yang diperoleh sebelumnya pada objek.

Rutinitas perlindungan run-down utama

Untuk mulai berbagi objek, driver yang memiliki objek memanggil rutinitas ExInitializeRundownProtection 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 rutinitas ExAcquireRundownProtection untuk meminta perlindungan run-down pada objek. Setelah akses selesai, driver ini memanggil rutinitas ExReleaseRundownProtection untuk merilis perlindungan run-down pada objek.

Jika driver pemilik menentukan bahwa objek bersama harus dihapus, driver ini menunggu untuk menghapus objek sampai semua akses objek yang terutang selesai.

Sebagai persiapan untuk menghapus objek bersama, driver pemilik memanggil rutinitas ExWaitForRundownProtectionRelease untuk menunggu objek berjalan. Selama panggilan ini, ExWaitForRundownProtectionRelease menunggu semua instans perlindungan run-down yang diberikan sebelumnya pada objek yang akan dirilis, tetapi mencegah permintaan baru untuk perlindungan run-down pada objek agar tidak diberikan. 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 merilis 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 run-down

Perlindungan run-down sangat 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 run-down untuk menjaga dari pembongkaran driver antivirus prematur saat menangani permintaan I/O. Setelah permintaan I/O selesai, perlindungan run-down dapat dirilis.

Perlindungan run-down tidak membuat serialisasi akses ke objek bersama. Jika dua atau lebih driver yang mengakses dapat secara bersamaan menahan perlindungan run-down pada objek, dan akses ke objek harus diserialisasikan, beberapa mekanisme lain, seperti kunci pengecualian bersama, harus digunakan untuk menserialisasikan akses.

Struktur EX_RUNDOWN_REF

Struktur EX_RUNDOWN_REF melacak status perlindungan run-down pada objek bersama. Struktur ini buram untuk driver. Rutinitas perlindungan run-down yang disediakan sistem menggunakan struktur ini untuk menghitung jumlah instans perlindungan run-down yang saat ini berlaku pada objek. Rutinitas ini juga menggunakan struktur ini untuk melacak apakah objek dijalankan atau sedang dalam proses dijalankan.

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 ExAcquireRundownProtection dan ExReleaseRundownProtection yang memperoleh dan merilis perlindungan run-down pada objek. Driver pemilik meneruskan struktur ini sebagai parameter ke panggilan ExWaitForRundownProtectionRelease yang menunggu objek berjalan ke bawah 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 ditangguhkan hingga semua akses objek yang terutang 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 sangat cepat. Manfaat menggunakan mekanisme ringan, seperti perlindungan run-down, dapat signifikan untuk objek bersama yang memiliki umur panjang dan dibagikan di antara banyak driver.

Rutinitas perlindungan run-down lainnya

Beberapa rutinitas perlindungan run-down lainnya tersedia, selain yang disebutkan sebelumnya. Rutinitas tambahan ini mungkin digunakan oleh beberapa driver.

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

Rutinitas ExRundownCompleted 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 increment dan decrement hitungan ini oleh satu, ExAcquireRundownProtectionEx dan ExReleaseRundownProtectionEx increment dan mengurangi hitungan dengan jumlah arbitrer.

Perlindungan run-down yang sadar cache

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

Untuk menghindari masalah ini, Anda dapat menggunakan referensi rundown sadar cache untuk mendistribusikan pelacakan referensi di beberapa baris cache. Ini mengurangi ketidakcocokan cache dan meningkatkan performa driver Anda pada komputer multiprosedur.

Untuk menggunakan referensi rundown sadar 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 diberikan, atau FALSE jika objek sedang dijalankan.
  3. Lepaskan perlindungan rundown pada objek setelah mengaksesnya dengan memanggil rutinitas ExReleaseRundownProtectionCacheAware.
  4. Tunggu hingga objek berjalan sebelum menghapusnya dengan memanggil rutinitas ExWaitForRundownProtectionReleaseCacheAware. Rutinitas ini memblokir utas saat ini hingga semua instans perlindungan rundown pada objek dirilis.
  5. Jika driver bernama ExAllocateCacheAwareRundownProtection sebelumnya, driver harus memanggil ExFreeCacheAwareRundownProtection untuk membebaskan referensi rundown.

Untuk menggunakan kembali referensi rundown yang sadar 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 sadar cache memiliki keuntungan dari performa dan skalabilitas yang lebih baik dalam situasi tertentu, tetapi menggunakan lebih banyak memori daripada referensi rundown biasa. Anda harus mempertimbangkan trade-off ini saat memilih antara dua jenis referensi rundown.