Fungsi MmAllocatePagesForMdlEx (wdm.h)
Rutinitas MmAllocatePagesForMdlEx mengalokasikan halaman memori fisik yang tidak di-patahkan ke MDL.
Gunakan rutinitas ini alih-alih MmAllocatePagesForMdl.
Sintaks
PMDL MmAllocatePagesForMdlEx(
[in] PHYSICAL_ADDRESS LowAddress,
[in] PHYSICAL_ADDRESS HighAddress,
[in] PHYSICAL_ADDRESS SkipBytes,
[in] SIZE_T TotalBytes,
[in] MEMORY_CACHING_TYPE CacheType,
[in] ULONG Flags
);
Parameter
[in] LowAddress
Menentukan alamat fisik awal rentang alamat pertama tempat halaman yang dialokasikan dapat berasal. Jika MmAllocatePagesForMdlEx tidak dapat mengalokasikan jumlah byte yang diminta dalam rentang alamat pertama, itu berulang melalui rentang alamat tambahan untuk mendapatkan lebih banyak halaman. Pada setiap perulangan, MmAllocatePagesForMdlEx menambahkan nilai SkipBytes ke alamat awal sebelumnya untuk mendapatkan awal rentang alamat berikutnya.
[in] HighAddress
Menentukan alamat fisik akhir rentang alamat pertama asal halaman yang dialokasikan.
[in] SkipBytes
Menentukan jumlah byte yang akan dilewati dari awal rentang alamat sebelumnya yang dapat berasal dari halaman yang dialokasikan. SkipBytes harus berupa bilangan bulat kelipatan ukuran halaman memori virtual, dalam byte.
[in] TotalBytes
Menentukan jumlah total byte yang akan dialokasikan untuk MDL.
[in] CacheType
Menentukan nilai MEMORY_CACHING_TYPE , yang menunjukkan jenis penembolokan yang diizinkan untuk memori yang diminta.
[in] Flags
Menentukan bendera untuk operasi ini. Atur parameter ini ke nol atau ke bitwise ATAU dari satu atau beberapa bit bendera MM_ALLOCATE_XXX berikut:
Empat item terakhir dalam daftar sebelumnya hanya didukung di Windows 7 dan versi Windows yang lebih baru.
Nilai | Makna |
---|---|
0x00000001 MM_DONT_ZERO_ALLOCATION | Jangan isi halaman yang dialokasikan dengan nol. Secara default, MmAllocatePagesForMdlEx nol halaman yang dialokasikannya. Dengan melewati operasi ini, Anda berpotensi meningkatkan performa panggilan MmAllocatePagesForMdlEx. Namun, Anda tidak boleh menggunakan bendera ini kecuali Anda tidak pernah mengekspos halaman yang dialokasikan ke program mode pengguna, atau Anda selalu menimpa konten asli halaman sebelum mengekspos halaman yang dialokasikan ke program mode pengguna. |
0x00000002 MM_ALLOCATE_FROM_LOCAL_NODE_ONLY | Alokasikan halaman hanya dari simpul ideal. Bendera ini hanya berlaku untuk sistem multiprosesor yang memiliki arsitektur akses memori non-seragam (NUMA). Dimulai dengan Windows Vista, bendera ini menunjukkan bahwa semua halaman harus dialokasikan dari simpul ideal utas saat ini. Tidak ada halaman yang akan dialokasikan dari simpul lain. Dalam versi Windows yang lebih lama dari Windows Vista, bendera ini menunjukkan bahwa semua halaman harus dialokasikan dari simpul lokal; yaitu, dari simpul tempat prosesor saat ini berada. Untuk informasi selengkapnya tentang sistem multiproscessor NUMA, lihat Dukungan NUMA . |
0x00000004 MM_ALLOCATE_FULLY_REQUIRED | Alokasi penuh diperlukan. Dimulai dengan Windows 7, bendera ini memerlukan MmAllocatePagesForMdlEx untuk mengembalikan NULL jika tidak dapat mengalokasikan semua halaman yang diminta. Rutinitas mengembalikan nilai non-NULL hanya jika berhasil mendapatkan seluruh alokasi yang diminta. Bendera ini memungkinkan manajer memori untuk melakukan alokasi secara lebih efisien dalam kasus di mana pemanggil memerlukan alokasi penuh. |
MM_ALLOCATE_NO_WAIT 0x00000008 | Jangan menunggu. Dimulai dengan Windows 7, bendera ini menunjukkan bahwa panggilan MmAllocatePagesForMdlEx tidak boleh memblokir utas panggilan. Biasanya, pemanggil adalah driver mode kernel yang berjalan di IRQL < DISPATCH_LEVEL tetapi tidak dapat mengizinkan eksekusinya diblokir. Misalnya, driver mungkin membantu operasi paging atau manajemen daya. Terlepas dari apakah bendera ini diatur, MmAllocatePagesForMdlEx tidak pernah memblokir penelepon yang berjalan di IRQL = DISPATCH_LEVEL. |
0x00000010 MM_ALLOCATE_PREFER_CONTIGUOUS | Alokasi dilakukan dengan cara yang meminimalkan fragmentasi memori sistem. Dimulai dengan Windows 7, bendera ini menunjukkan bahwa pemanggil ingin menghindari memori fisik terfragmentasi untuk membuat memori yang lebih berdampingan tersedia untuk pemanggil lain. Halaman yang dialokasikan tidak dijamin (dan biasanya tidak) berdekatan secara fisik, bahkan jika banyak memori yang berdekatan tersedia. Penelepon yang memerlukan memori yang berdampingan harus menentukan MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS alih-alih MM_ALLOCATE_PREFER_CONTIGUOUS. |
0x00000020 MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS | Memori yang bersebelah diperlukan. Dimulai dengan Windows 7, bendera ini menunjukkan bahwa halaman yang diminta harus dialokasikan sebagai blok memori fisik yang berdekatan. Jika parameter SkipBytes adalah nol, MmAllocatePagesForMdlEx berhasil dan mengembalikan satu blok yang berdekatan, atau gagal dan mengembalikan NULL. Ini tidak pernah mengembalikan alokasi parsial. Untuk SkipBytes = 0, halaman yang dialokasikan memenuhi persyaratan rentang alamat yang ditentukan oleh parameter LowAddress dan HighAddress, tetapi halaman tidak tunduk pada batasan perataan khusus. Jika SkipBytes bukan nol, SkipBytes harus memiliki kekuatan dua dan harus lebih besar dari atau sama dengan PAGE_SIZE, dan nilai parameter TotalBytes harus kelipatan SkipBytes. Dalam hal ini, MDL yang dikembalikan dapat berisi beberapa blok halaman yang berdampingan. Artinya, setiap blok berdamai secara internal tetapi blok tidak selalu berdamai satu sama lain. Setiap blok halaman yang berdekatan dijamin persis panjang SkipBytes dan diselaraskan pada batas SkipBytes. Alokasi parsial dapat terjadi jika SkipBytes bukan nol, tetapi setiap blok yang bersebelahan dalam alokasi parsial dijamin panjangnya SkipBytes. |
0x00000040 MM_ALLOCATE_FAST_LARGE_PAGES | Dimulai dengan Windows 8, bendera ini menentukan bahwa alokasi harus dipenuhi dari cache halaman besar sistem operasi. Jika cache kosong, alokasi gagal. Jika MM_ALLOCATE_FAST_LARGE_PAGES tidak ditentukan, MmAllocatePagesForMdlEx menggunakan halaman besar yang di-cache jika tersedia. Jika cache habis, MmAllocatePagesForMdlEx mencoba membuat halaman besar tambahan, yang mungkin memakan waktu lama. MM_ALLOCATE_FAST_LARGE_PAGES harus digunakan dengan bendera MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS. Parameter SkipBytes harus diatur ke kelipatan ukuran halaman besar. |
0x00000100 MM_ALLOCATE_AND_HOT_REMOVE | Dimulai dengan Windows 10, bendera ini menyebabkan halaman yang dialokasikan dihapus dari kumpulan memori fisik yang dikelola oleh Windows. MM_ALLOCATE_AND_HOT_REMOVE tidak dapat ditentukan bersama dengan MM_ALLOCATE_FULLY_REQUIRED. Jika MM_ALLOCATE_AND_HOT_REMOVE ditentukan, pemanggil harus berjalan di IRQL = PASSIVE_LEVEL. |
Mengembalikan nilai
MmAllocatePagesForMdlEx mengembalikan salah satu hal berikut:
Menampilkan kode | Deskripsi |
---|---|
Penunjuk MDL | Nilai pengembalian non-NULL adalah penunjuk ke MDL yang menjelaskan sekumpulan halaman fisik dalam rentang alamat yang ditentukan. Jika jumlah byte yang diminta tidak tersedia, MDL menjelaskan memori fisik sebanyak yang tersedia. |
NULL | Menunjukkan bahwa tidak ada halaman memori fisik yang tersedia dalam rentang alamat yang ditentukan, atau bahwa tidak ada cukup kumpulan memori untuk MDL itu sendiri. |
Keterangan
Secara default, halaman memori fisik yang dikembalikan MmAllocatePagesForMdlEx bukan halaman yang berdampingan. Dimulai dengan Windows 7, penelepon dapat mengambil alih perilaku default rutinitas ini dengan mengatur bit bendera MM_ALLOCATE_PREFER_CONTIGUOUS atau MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS dalam parameter Bendera .
MmAllocatePagesForMdlEx dirancang untuk driver mode kernel yang tidak memerlukan alamat virtual yang sesuai (yaitu, mereka membutuhkan halaman fisik dan tidak memerlukannya untuk berdekatan secara fisik), dan untuk driver mode kernel yang dapat mencapai perolehan performa yang substansial jika memori fisik untuk perangkat dialokasikan dalam rentang alamat fisik tertentu (misalnya, kartu grafis AGP).
Bergantung pada berapa banyak memori fisik yang saat ini tersedia dalam rentang yang diminta, MmAllocatePagesForMdlEx mungkin mengembalikan MDL yang menjelaskan lebih sedikit memori daripada yang diminta. Rutinitas juga dapat mengembalikan NULL jika tidak ada memori yang dialokasikan. Pemanggil harus memeriksa jumlah memori yang benar-benar dialokasikan untuk MDL.
Pemanggil harus menggunakan MmFreePagesFromMdl untuk merilis halaman memori yang dijelaskan oleh MDL yang dibuat oleh MmAllocatePagesForMdlEx. Setelah memanggil MmFreePagesFromMdl, pemanggil juga harus memanggil ExFreePool untuk merilis memori yang dialokasikan untuk struktur MDL.
Secara default, MmAllocatePagesForMdlEx mengisi halaman yang dialokasikan dengan nol. Pemanggil dapat menentukan bendera MM_DONT_ZERO_ALLOCATION untuk mengambil alih default ini dan mungkin meningkatkan performa.
Memori yang dialokasikan MmAllocatePagesForMdlEx tidak diinisialisasi jika Anda menentukan bendera MM_DONT_ZERO_ALLOCATION. Driver mode kernel harus terlebih dahulu nol memori ini jika driver akan membuat memori terlihat oleh perangkat lunak mode pengguna (untuk menghindari bocornya konten yang berpotensi istimewa). Untuk informasi selengkapnya tentang bendera ini, lihat MM_ALLOCATE_XXX.
Jumlah maksimum memori yang dapat dialokasikan MmAllocatePagesForMdlEx dalam satu panggilan adalah (4 gigabyte - PAGE_SIZE). Rutinitas dapat memenuhi permintaan alokasi untuk jumlah ini hanya jika tersedia cukup halaman.
MmAllocatePagesForMdlEx berjalan di IRQL <= APC_LEVEL. Penelepon MmAllocatePagesForMdlEx diizinkan berada di DISPATCH_LEVEL. Namun, Anda dapat meningkatkan performa driver dengan memanggil di APC_LEVEL atau di bawahnya.
Persyaratan
Persyaratan | Nilai |
---|---|
Target Platform | Universal |
Header | wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h) |
Pustaka | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | Lihat bagian Keterangan. |
Aturan kepatuhan DDI | IrqlMmApcLte(wdm) |