Menggunakan Daftar Lookaside

Driver yang harus mengalokasikan buffer ukuran tetap secara dinamis untuk melakukan operasi I/O sesuai permintaan dapat menggunakan rutinitas dukungan ExXxxLookasideListEx atau ExXxxLookasideList . Setelah driver seperti itu menginisialisasi daftar tampilannya, sistem operasi akan menyimpan beberapa buffer yang dialokasikan secara dinamis dari ukuran yang diberikan dalam daftar tampilan driver, secara efektif menyimpan serangkaian buffer ukuran tetap yang dapat digunakan kembali untuk driver. Format dan isi buffer ukuran tetap driver (juga dikenal sebagai entri) dalam daftar tampilannya ditentukan driver.

Misalnya, driver kelas penyimpanan yang harus menyiapkan blok permintaan SCSI (SRB) untuk port SCSI/driver miniport yang mendasar menggunakan daftar lookaside. Driver kelas seperti itu mengalokasikan buffer untuk SRB sesuai kebutuhan dari daftar tampilannya dan merilis setiap buffer SRB kembali ke daftar lookaside untuk daftar lookaside untuk digunakan kembali setiap kali SRB dikembalikan ke driver kelas dalam IRP yang telah selesai. Karena driver kelas penyimpanan tidak dapat menentukan berapa banyak SRB yang harus digunakan kapan saja karena permintaan I/O pada driver meningkat dan turun, daftar lookaside adalah cara yang nyaman dan ekonomis untuk mengelola alokasi dan pembatalan alokasi buffer untuk SRB ukuran tetap dalam driver seperti itu.

Sistem operasi mempertahankan status tentang semua daftar tampilan halaman dan tidak dipagasi yang saat ini digunakan, secara dinamis melacak permintaan alokasi dan dealokasi entri di semua daftar, dan kumpulan sistem yang tersedia untuk entri baru. Ketika permintaan alokasi tinggi, sistem operasi meningkatkan jumlah entri yang disimpannya di setiap daftar tampilan. Ketika permintaan turun lagi, ia membebaskan entri tampilan surplus kembali ke kumpulan sistem.

Daftar lookaside aman untuk utas. Daftar lookaside memiliki sinkronisasi bawaan untuk mengaktifkan beberapa utas yang berjalan bersamaan dalam driver untuk berbagi daftar lookaside. Utas ini dapat dengan aman mengalokasikan buffer dari daftar tampilan bersama dan membebaskan buffer ini ke daftar tanpa mengharuskan driver untuk secara eksplisit menyinkronkan operasi ini. Namun, untuk menghindari kemungkinan kebocoran dan kerusakan data, sekumpulan utas yang berbagi daftar lookaside harus secara eksplisit menyinkronkan inisialisasi dan penghapusan daftar.

Antarmuka daftar lookaside

Dimulai dengan Windows Vista, struktur LOOKASIDE_LIST_EX menjelaskan daftar lookaside yang dapat berisi buffer halaman atau non-halaman. Jika driver menyediakan rutinitas Alokasi kustom dan Gratis untuk daftar lookaside ini, rutinitas ini menerima konteks privat sebagai parameter input. Driver dapat menggunakan konteks ini untuk mengumpulkan data privat untuk daftar lookaside. Misalnya, konteks dapat digunakan untuk menghitung jumlah entri daftar yang dialokasikan secara dinamis dan dibebaskan oleh daftar. Untuk contoh kode yang menunjukkan cara menggunakan konteks dengan cara ini, lihat ExInitializeLookasideListEx.

Rutinitas yang disediakan sistem berikut mendukung daftar lookaside yang dijelaskan oleh struktur LOOKASIDE_LIST_EX :

ExAllocateFromLookasideListEx

ExDeleteLookasideListEx

ExFlushLookasideListEx

ExFreeToLookasideListEx

ExInitializeLookasideListEx

Dimulai dengan Windows 2000, struktur PAGED_LOOKASIDE_LIST menjelaskan daftar tampilan yang berisi buffer halaman. Jika driver menyediakan rutinitas Alokasi kustom dan Gratis untuk daftar lookaside ini, rutinitas ini tidak menerima konteks privat sebagai parameter input. Untuk alasan ini, jika driver Anda dimaksudkan untuk berjalan hanya pada Windows Vista dan versi Windows yang lebih baru, pertimbangkan untuk menggunakan struktur LOOKASIDE_LIST_EX alih-alih struktur PAGED_LOOKASIDE_LIST untuk daftar lookaside Anda. Rutinitas yang disediakan sistem berikut mendukung daftar lookaside yang dijelaskan oleh struktur PAGED_LOOKASIDE_LIST :

ExAllocateFromPagedLookasideList

ExDeletePagedLookasideList

ExFreeToPagedLookasideList

ExInitializePagedLookasideList

Dimulai dengan Windows 2000, struktur NPAGED_LOOKASIDE_LIST menjelaskan daftar lookaside yang berisi buffer yang tidak dipagasi. Jika driver menyediakan rutinitas Alokasi kustom dan Gratis untuk daftar lookaside ini, rutinitas ini tidak menerima konteks privat sebagai parameter input. Sekali lagi, jika driver Anda dimaksudkan untuk berjalan hanya pada Windows Vista dan versi Windows yang lebih baru, pertimbangkan untuk menggunakan struktur LOOKASIDE_LIST_EX alih-alih struktur NPAGED_LOOKASIDE_LIST untuk daftar lookaside Anda. Rutinitas yang disediakan sistem berikut mendukung daftar lookaside yang dijelaskan oleh struktur NPAGED_LOOKASIDE_LIST :

ExAllocateFromNPagedLookasideList

ExDeleteNPagedLookasideList

ExFreeToNPagedLookasideList

ExInitializeNPagedLookasideList

Pedoman pelaksanaan

Untuk mengimplementasikan daftar lookaside yang menggunakan struktur LOOKASIDE_LIST_EX , ikuti panduan desain berikut:

  • Panggil ExInitializeLookasideListEx untuk menyiapkan daftar pencarian. Dalam panggilan ini, tentukan apakah entri dalam daftar tampilan akan di-paged atau buffer yang tidak di-halaman. Gunakan buffer yang tidak bertumpuk jika driver itu sendiri atau driver yang mendasar yang melewati entri daftar tampilannya mungkin mengakses entri ini di IRQL >= DISPATCH_LEVEL. Gunakan buffer halaman hanya jika akses ke entri daftar tampilan driver selalu terjadi di IRQL <= APC_LEVEL.

  • Struktur LOOKASIDE_LIST_EX untuk daftar lookaside harus selalu berada di memori sistem yang tidak di-halaman terlepas dari apakah entri dalam daftar dipagasi atau tidak.

  • Untuk performa yang lebih baik, berikan pointer NULL untuk parameter Alokasi dan Gratis ke ExInitializeLookasideListEx kecuali jika rutinitas alokasi dan dealokasi harus melakukan lebih dari sekadar mengalokasikan dan membebaskan memori untuk entri daftar lookaside. Misalnya, rutinitas ini mungkin merekam informasi tentang penggunaan buffer yang dialokasikan secara dinamis oleh driver.

  • Rutinitas Alokasi yang disediakan driver dapat meneruskan parameter input (PoolType, Tag, dan Size) yang diterimanya langsung ke rutinitas ExAllocatePoolWithTag atau ExAllocatePoolWithQuotaTag untuk mengalokasikan buffer baru.

  • Untuk setiap panggilan ke ExAllocateFromLookasideListEx, lakukan panggilan timbal balik ke ExFreeToLookasideListEx sesegera mungkin setiap kali entri yang dialokasikan sebelumnya tidak lagi digunakan.

Memasok rutinitas Alokasi dan Gratis yang tidak lebih dari memanggil ExAllocatePoolWithTag dan ExFreePool, masing-masing, membuang siklus prosesor. ExAllocateFromLookasideListEx melakukan panggilan yang diperlukan ke ExAllocatePoolWithTag dan ExFreePool secara otomatis ketika driver melewati NULLAllocate dan Free pointer ke ExInitializeLookasideListEx.

Setiap rutinitas Alokasi yang disediakan driver tidak boleh mengalokasikan memori untuk entri dari kumpulan halaman yang akan ditahan dalam daftar lookaside yang tidak dipagasi atau sebaliknya. Ini juga harus mengalokasikan entri ukuran tetap, karena setiap panggilan driver berikutnya ke ExAllocateFromLookasideListEx mengembalikan entri pertama yang saat ini disimpan dalam daftar lookaside kecuali daftar kosong. Artinya, panggilan ke ExAllocateFromLookasideListEx menyebabkan panggilan ke rutinitas Alokasikan yang disediakan driver hanya jika daftar lookaside yang diberikan saat ini kosong. Oleh karena itu, pada setiap panggilan ke ExAllocateFromLookasideListEx, entri yang dikembalikan akan persis ukuran yang dibutuhkan driver hanya jika semua entri dalam daftar lookaside berukuran tetap. Rutinitas Alokasi yang disediakan driver juga tidak boleh mengubah nilai Tag yang awalnya diteruskan driver ke ExInitializeLookasideListEx, karena perubahan nilai pool-tag akan membuat penelusuran kesalahan dan melacak penggunaan memori driver lebih sulit.

Panggilan ke penyimpanan ExFreeToLookasideListEx yang sebelumnya dialokasikan entri dalam daftar lookaside kecuali daftar sudah penuh (artinya, daftar berisi jumlah entri maksimum yang ditentukan sistem). Untuk performa yang lebih baik, driver harus melakukan panggilan timbal balik ke ExFreeToLookasideListEx secepat mungkin untuk setiap panggilan yang dilakukannya ke ExAllocateFromLookasideListEx. Ketika driver membebaskan entri kembali ke daftar tampilannya dengan cepat, panggilan berikutnya driver ke ExAllocateFromLookasideListEx jauh lebih kecil kemungkinannya untuk dikenakan penalti performa mengalokasikan memori secara dinamis untuk entri baru.

Panduan serupa berlaku untuk daftar lookaside yang menggunakan struktur PAGED_LOOKASIDE_LIST atau NPAGED_LOOKASIDE_LIST .