Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penting
DDI ExAllocatePool yang dibahas dalam topik ini telah ditolak di 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 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 dalam jumlah 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.
Pool non-halaman biasanya menjadi terpecah saat sistem berjalan, sehingga rutinitas driver DriverEntry harus memanggil rutinitas tersebut untuk menyiapkan 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 garis cache data prosesor) untuk memberikan performa terbaik.
Driver harus mengalokasikan buffer I/O se-ekonomis mungkin, karena memori kumpulan yang tidak dipaginasi adalah sumber daya sistem yang terbatas. Biasanya, driver harus menghindari memanggil 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.
Cara Mengalokasikan Ruang Memori Pengemudi Secara Ekonomis
Untuk mengalokasikan memori buffer I/O secara ekonomis, ketahui hal-hal berikut:
Setiap panggilan ke MmAllocateNonCachedMemory atau MmAllocateContiguousMemorySpecifyCache selalu mengembalikan memori ruang sistem non-paging dalam kelipatan penuh dari ukuran halaman sistem, berapa pun ukuran alokasi yang diminta. Oleh karena itu, permintaan untuk kurang dari satu halaman dibulatkan menjadi satu halaman penuh dan sisa byte di halaman tersebut terbuang; mereka tidak dapat diakses oleh driver yang memanggil fungsi tersebut 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 register peta dan penggunaan buffer umum, lihat Objek Adapter dan DMA.
Mengalokasikan Memori dengan ExAllocatePoolWithTag
Driver juga dapat memanggilExAllocatePoolWithTag , 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 dialokasikan terakhir terbuang: 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 bagi pemanggil atau penelepon lain. Untuk menghindari pemborosan kumpulan nonpaged, pengandar 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 NULL pointer jika tidak dapat mengalokasikan jumlah byte yang diminta. Driver harus selalu memeriksa penunjuk yang dikembalikan. Jika nilainya null, DriverEntry rutin (atau rutinitas driver lain yang mengembalikan nilai NTSTATUS) harus mengembalikan STATUS_INSUFFICIENT_RESOURCES atau menangani kondisi kesalahan jika memungkinkan.