Bagikan melalui


Makro MmLockPagableCodeSection (wdm.h)

Rutinitas MmLockPagableCodeSection mengunci bagian kode driver, yang berisi serangkaian rutinitas driver yang ditandai dengan direktif kompilator khusus, ke dalam ruang sistem.

Sintaks

void MmLockPagableCodeSection(
  [in]  Address
);

Parameter

[in] Address

Menentukan alamat simbolis. Alamat ini biasanya merupakan nama fungsi driver dalam bagian kode driver yang telah ditandai dengan sesuatu seperti #pragma alloc_text (PAGExxxx, driverfungsi). Semua fungsi di bagian PAGExxxx kemudian dijamin akan dikunci ketika fungsi ini kembali.

Nilai kembali

Tidak ada

Keterangan

MmLockPagableCodeSection mengembalikan nilai buram yang digunakan sistem operasi untuk mengidentifikasi bagian kode driver ini. Nilai buram ini kemudian dapat diteruskan ke MmLockPagableSectionByHandle (jika driver membuka kunci dan kemudian mengunci ulang bagian) atau ke MmUnlockPagableImageSection.

Rutinitas MmLockPagableCodeSection dan MmUnlockPagableImageSection (rutinitas yang melakukan tindakan yang berlawanan) mendukung driver yang dapat melakukan hal berikut:

  • Tangguhkan pemuatan subset rutinitas driver ke dalam memori residen hingga permintaan I/O masuk untuk perangkat driver membuatnya perlu agar rutinitas ini memproses runtime integrasi.

  • Buat subset rutinitas driver yang sama tersedia untuk paging out ketika mereka telah menyelesaikan pemrosesan permintaan I/O dan tidak ada permintaan tambahan untuk perangkat driver yang saat ini diharapkan.

MmLockPagableCodeSection, MmLockPagableSectionByHandle , dan MmUnlockPagableImageSection ditujukan untuk digunakan oleh driver perangkat dan perantara yang memiliki karakteristik berikut:

  • Driver memiliki jalur kode yang mungkin tidak diperlukan saat sistem berjalan, tetapi, jika diperlukan, kode driver harus residen karena berjalan dalam konteks utas arbitrer atau di IRQL >= DISPATCH_LEVEL.

  • Driver dapat menentukan dengan tepat kapan rutinitas yang dapat dipaginasi harus dimuat dan kapan mereka dapat di-page out lagi.

Misalnya, driver disk toleran terhadap kesalahan yang disediakan sistem mendukung pembuatan set cermin, set garis, dan set volume. Namun, komputer tertentu hanya dapat dikonfigurasi dengan set cermin, hanya dengan set stripe, hanya dengan set volume, atau dengan kombinasi apa pun dari ketiga opsi yang mungkin ini. Dalam keadaan ini, driver ftdisk sistem mengurangi ukuran gambar yang dimuat dengan menandai rutinitas yang secara eksplisit mendukung cermin, garis, dan set volume sebagai milik bagian kode yang dapat dipaginasi. Selama inisialisasi driver, bagian kode yang dapat di-pageable dijadikan residen hanya jika pengguna telah mengonfigurasi disk untuk memiliki mirror, stripe, atau volume set. Jika pengguna mempartisi ulang disk secara dinamis, driver ftdisk mengunci bagian kode pageable tambahan yang diperlukan untuk mendukung cermin, stripe, atau kumpulan volume apa pun yang diminta pengguna.

Sebagai contoh lain, driver serial dan paralel yang disediakan sistem memiliki rutinitas DispatchCreate dan DispatchClose yang dipanggil ketika port tertentu dibuka untuk I/O eksklusif dan ketika handel untuk port yang dibuka dirilis, masing-masing. Namun, permintaan I/O serial dan paralel bersifat sporadis, ditentukan oleh aplikasi mana yang saat ini dijalankan pengguna akhir dan opsi aplikasi mana yang saat ini berolahraga oleh pengguna akhir. Dalam keadaan ini, serial sistem dan driver paralel mengurangi ukuran gambar yang dimuat dengan menandai banyak rutinitas sebagai milik bagian kode yang dapat dipaginasi bahwa rutinitas DispatchCreate membuat penghuni hanya ketika port pertama dibuka untuk I/O.

Perhatikan bahwa setiap driver sistem sebelumnya memenuhi kedua kriteria untuk memiliki bagian yang dapat di-pageable: driver memiliki jalur kode yang mungkin tidak diperlukan saat sistem berjalan, dan driver dapat menentukan dengan tepat kapan bagian yang dapat di-pageable harus dimuat dan dapat di-page out lagi.

Karena ini adalah operasi mahal untuk mengunci bagian, jika driver mengunci bagian kode yang dapat dipaginasi di lebih dari satu tempat, gunakan MmLockPagableCodeSection untuk permintaan pertama. Buat permintaan kunci berikutnya dengan memanggil MmLockPagableSectionByHandle melewati handel yang dikembalikan oleh MmLockPagableCodeSection. Penguncian dengan menangani secara signifikan meningkatkan performa driver karena manajer memori menggunakan nilai pengembalian buram untuk menemukan bagian yang relevan dengan cepat daripada mencari daftar modul yang dimuat. Bagian terkunci tidak terkunci dengan memanggil MmUnlockPagableImageSection.

Setiap rutinitas driver dalam bagian kode yang dapat dipaginasi harus ditandai dengan direktif kompilator berikut:

#pragma alloc_text(PAGExxxx, DriverRoutine)

di mana xxxx adalah pengidentifikasi unik empat karakter opsional untuk bagian penelepon yang dapat dipaginasi dan DriverRoutine adalah titik masuk yang akan disertakan dalam bagian kode yang dapat dipaginasi. HALAMAN kata kunci dan akhiran yang ditentukan driver, yang dapat mencapai empat karakter, peka huruf besar/kecil; artinya, PAGE harus dikapitalisasi.

Satu panggilan ke MmLockPagableCodeSection di, misalnya, rutinItas DispatchCreate driver, menyebabkan seluruh bagian, berisi setiap rutinitas driver yang ditandai dengan pengidentifikasi xxxxPAGE yang sama, untuk dikunci di ruang sistem.

Jenis rutinitas driver tertentu tidak dapat dijadikan bagian dari bagian halaman driver apa pun, termasuk yang berikut ini:

  • Jangan pernah membuat ISR dapat di-pageable. Dimungkinkan bagi driver perangkat untuk menerima gangguan yang memacu meskipun perangkatnya tidak digunakan, terutama jika vektor interupsi dapat dibagikan. Secara umum, bahkan jika driver dapat secara eksplisit menonaktifkan gangguan pada perangkatnya, ISR tidak boleh dibuat dapat dipaginasi.

  • Jangan pernah membuat DPC rutin dapat dipaginasi jika driver tidak dapat mengontrol kapan DPC diantrekan, seperti rutinitas DpcForIsr atau CustomDpc yang mungkin diantrekan dari ISR. Secara umum, rutinitas driver yang berjalan di IRQL >= DISPATCH_LEVEL dan yang dapat dipanggil dalam konteks utas arbitrer atau sebagai respons terhadap peristiwa eksternal acak tidak boleh dibuat pageable.

  • Jangan pernah membuat halaman rutin DispatchRead atau DispatchWrite di driver apa pun yang mungkin menjadi bagian dari jalur I/O halaman sistem. Driver disk yang mungkin berisi file halaman sistem harus memiliki rutinitas DispatchRead dan DispatchWrite yang bersifat residen saat sistem berjalan, karena harus semua driver berlapis di atas driver disk tersebut.

Perhatikan bahwa rutinitas di bagian pageable yang ditandai dengan direktif kompilator #pragma alloc_text (PAGExxxx, ...) berbeda dari rutinitas yang ditandai dengan direktif kompilator #pragma alloc_text (INIT, ...). Rutinitas di bagian INIT tidak dapat dipaginasi dan dibuang segera setelah driver kembali dari DriverEntry atau rutinitas Reinitialize-nya , jika memilikinya.

Manajer memori mempertahankan jumlah kunci internal pada bagian yang dapat diperhitungkan driver mana pun. Panggilan ke MmLockPagableCodeSection meningkatkan jumlah ini dan mmUnlockPagableImageSection reciprocal mengurangi hitungan. Bagian yang dapat di-pageable driver tidak tersedia untuk di-page out kecuali jumlah ini nol.

Untuk informasi selengkapnya tentang membuat bagian kode yang dapat di-pageable, lihat Membuat Driver Dapat Di-Pageable.

Persyaratan

Persyaratan Nilai
Target Platform Desktop
Header wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=APC_LEVEL

Lihat juga

MmLockPagableDataSection

MmLockPagableSectionByHandle

MmPageEntireDriver

MmResetDriverPaging

MmUnlockPagableImageSection