Bagikan melalui


Mengalokasikan Memori System-Space

Penting

ExAllocatePool DDIs yang dibahas dalam topik ini tidak digunakan lagi dalam Windows 10, versi 2004 dan telah digantikan oleh ExAllocatePool2 dan ExAllocatePool3. Untuk informasi selengkapnya, lihat Memperbarui panggilan ExAllocatePool yang tidak digunakan lagi ke ExAllocatePool2 dan ExAllocatePool3.

Driver dapat menggunakan ruang yang dialokasikan sistem dalam ekstensi perangkat mereka sebagai area penyimpanan global untuk informasi khusus perangkat. Driver hanya dapat menggunakan tumpukan kernel untuk meneruskan sejumlah kecil data ke rutinitas internal mereka. Beberapa driver harus mengalokasikan memori ruang sistem tambahan yang lebih besar, biasanya untuk buffer I/O.

Untuk mengalokasikan ruang buffer I/O, rutinitas alokasi memori terbaik untuk digunakan adalah MmAllocateNonCachedMemory, MmAllocateContiguousMemorySpecifyCache, AllocateCommonBuffer (jika perangkat driver menggunakan DMA master bus atau mode inisialisasi otomatis pengontrol DMA sistem), atau ExAllocatePoolWithTag.

Kumpulan yang tidak disebarkan biasanya menjadi terfragmentasi saat sistem berjalan, sehingga rutinitas DriverEntry driver harus memanggil rutinitas ini untuk mengatur buffer I/O jangka panjang yang dibutuhkan driver. Masing-masing rutinitas ini, kecuali ExAllocatePoolWithTag, mengalokasikan memori yang selaras pada batas khusus prosesor (ditentukan oleh ukuran baris cache data prosesor) untuk memberikan performa terbaik.

Driver harus mengalokasikan buffer I/O secara ekonomis mungkin, karena memori kumpulan yang tidak di-patahkan adalah sumber daya sistem yang terbatas. Biasanya, driver harus menghindari panggilan rutinitas dukungan ini berulang kali untuk meminta alokasi kurang dari PAGE_SIZE karena setiap alokasi yang kurang dari PAGE_SIZE juga dilengkapi dengan header kumpulan yang digunakan untuk mengelola alokasi secara internal.

Tips Mengalokasikan Driver Buffer Space Secara Ekonomis

Untuk mengalokasikan memori buffer I/O secara ekonomis, ketahui hal-hal berikut:

  • Setiap panggilan ke MmAllocateNonCachedMemory atau MmAllocateContiguousMemorySpecifyCache selalu mengembalikan kelipatan penuh dari ukuran halaman sistem, memori ruang sistem yang tidak di-patahkan, apa pun ukuran alokasi yang diminta. Oleh karena itu, permintaan untuk kurang dari halaman dibulatkan ke halaman penuh dan byte yang tersisa di halaman terbuang sia-sia; mereka tidak dapat diakses oleh driver yang memanggil fungsi dan tidak dapat digunakan oleh kode mode kernel lainnya.

  • Setiap panggilan ke AllocateCommonBuffer menggunakan setidaknya satu register peta objek adaptor, yang memetakan setidaknya satu byte dan paling banyak satu halaman. Untuk informasi selengkapnya tentang daftar peta dan menggunakan buffer umum, lihat Objek Adapter dan DMA.

Mengalokasikan Memori dengan ExAllocatePoolWithTag

Driver juga dapat memanggil ExAllocatePoolWithTag, menentukan salah satu nilai POOL_TYPE yang ditentukan sistem berikut untuk parameter PoolType :

  • PoolType = NonPagedPool untuk objek atau sumber daya apa pun yang tidak disimpan dalam ekstensi perangkat atau ekstensi pengontrol yang mungkin diakses driver saat berjalan di IRQL > APC_LEVEL.

    Untuk nilai PoolType ini, ExAllocatePoolWithTag mengalokasikan jumlah memori yang diminta jika NumberOfBytes yang ditentukan kurang dari atau sama dengan PAGE_SIZE. Jika tidak, byte yang tersisa pada halaman yang terakhir dialokasikan akan terbuang sia-sia: tidak dapat diakses oleh pemanggil dan tidak dapat digunakan oleh kode mode kernel lainnya.

    Misalnya, pada x86, permintaan alokasi 5 kilobyte (KB) mengembalikan dua halaman 4-KB. 3 KB terakhir dari halaman kedua tidak tersedia untuk penelepon atau penelepon lain. Untuk menghindari pemborosan kumpulan yang tidak disebarkan, driver harus mengalokasikan beberapa halaman secara efisien. Dalam hal ini, misalnya, driver dapat membuat dua alokasi, satu untuk PAGE_SIZE dan yang lainnya untuk 1 KB, untuk mengalokasikan total 5 KB.

    Catatan Dimulai dengan Windows Vista, sistem secara otomatis menambahkan memori tambahan sehingga dua alokasi tidak perlu.

  • PoolType = PagedPool untuk memori yang selalu diakses di IRQL <= APC_LEVEL dan tidak berada di jalur tulis sistem file.

ExAllocatePoolWithTag mengembalikan penunjuk NULL jika tidak dapat mengalokasikan jumlah byte yang diminta. Driver harus selalu memeriksa penunjuk yang dikembalikan. Jika nilainya NULL, rutinitas DriverEntry (atau rutinitas driver lain yang mengembalikan nilai NTSTATUS) harus mengembalikan STATUS_INSUFFICIENT_RESOURCES atau menangani kondisi kesalahan jika memungkinkan.