Fungsi MmAllocateNodePagesForMdlEx (wdm.h)
Rutinitas MmAllocateNodePagesForMdlEx mengalokasikan memori fisik yang tidak dipagasi dari simpul ideal, dan mengalokasikan struktur MDL untuk menggambarkan memori ini.
Sintaks
PMDL MmAllocateNodePagesForMdlEx(
[in] PHYSICAL_ADDRESS LowAddress,
[in] PHYSICAL_ADDRESS HighAddress,
[in] PHYSICAL_ADDRESS SkipBytes,
[in] SIZE_T TotalBytes,
[in] MEMORY_CACHING_TYPE CacheType,
[in] ULONG IdealNode,
[in] ULONG Flags
);
Parameter
[in] LowAddress
Alamat fisik awal alamat pertama berkisar dari mana halaman yang dialokasikan dapat datang. Jika MmAllocateNodePagesForMdlEx tidak dapat mengalokasikan jumlah byte yang diminta dalam rentang alamat pertama, rutin berulang melalui rentang alamat tambahan untuk mendapatkan lebih banyak halaman. Pada setiap perulangan, MmAllocateNodePagesForMdlEx menambahkan nilai SkipBytes ke alamat awal sebelumnya untuk menghitung awal rentang alamat berikutnya.
[in] HighAddress
Alamat fisik akhir rentang alamat pertama tempat halaman yang dialokasikan dapat berasal.
[in] SkipBytes
Jumlah byte yang akan dilewati dari awal rentang alamat sebelumnya yang dapat berasal dari halaman yang dialokasikan. SkipBytes harus berupa kelipatan bilangan bulat dari ukuran halaman memori virtual, dalam byte.
[in] TotalBytes
Jumlah total byte yang akan dialokasikan untuk MDL.
[in] CacheType
Nilai MEMORY_CACHING_TYPE , yang menunjukkan jenis penembolokan yang diizinkan untuk memori yang diminta.
[in] IdealNode
Nomor simpul yang ideal. Jika sistem multiproscessor berisi simpul N, nomor simpul yang valid berada dalam rentang 0 hingga N-1. Driver Anda dapat memanggil rutinitas KeQueryHighestNodeNumber untuk mendapatkan nomor node tertinggi. Sistem multiprosesor prosesor tunggal atau non-NUMA hanya memiliki satu simpul, simpul 0, untuk mengalokasikan memori. Untuk sistem multiproscessor NUMA, alokasi dibuat dari simpul ideal, jika memungkinkan. Jika memori tidak cukup tersedia di simpul ideal untuk memenuhi permintaan alokasi, dan pemanggil tidak mengatur bendera MM_ALLOCATE_FROM_LOCAL_NODE_ONLY, MmAllocateNodePagesForMdlEx akan mencoba mengalokasikan memori dari simpul lain.
[in] Flags
Bendera untuk operasi ini. Atur parameter ini ke nol atau ke bitwise-OR dari satu atau beberapa bit bendera berikut:
MM_DONT_ZERO_ALLOCATION
MM_ALLOCATE_FROM_LOCAL_NODE_ONLY
MM_ALLOCATE_FULLY_REQUIRED
MM_ALLOCATE_NO_WAIT
MM_ALLOCATE_PREFER_CONTIGUOUS
MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS
MM_ALLOCATE_AND_HOT_REMOVE
Untuk informasi selengkapnya tentang bendera ini, lihat MM_ALLOCATE_XXX.
Nilai kembali
MmAllocateNodePagesForMdlEx mengembalikan pointer ke struktur MDL jika berhasil. Jika tidak, jika rutinitas gagal mengalokasikan memori apa pun, rutinitas mengembalikan NULL.
Nilai pengembalian NULL menunjukkan bahwa tidak ada halaman memori fisik yang tersedia dalam rentang alamat yang ditentukan, atau bahwa tidak ada cukup kumpulan memori yang tersedia untuk mengalokasikan struktur MDL.
Jika rutinitas berhasil mengalokasikan beberapa, tetapi tidak semua, dari memori yang diminta, MDL menggambarkan memori fisik sebanyak rutinitas yang dapat dialokasikan.
Keterangan
Dalam sistem multiprosesor akses memori non-seragam (NUMA), pemanggil dapat menentukan simpul ideal untuk mengalokasikan memori. Simpul adalah kumpulan prosesor yang berbagi akses cepat ke wilayah memori. Dalam multiprosesor non-NUMA atau sistem prosesor tunggal, MmAllocateNodePagesForMdlEx memperlakukan semua memori sebagai milik satu simpul dan mengalokasikan memori dari simpul ini.
Secara default, halaman memori fisik yang dikembalikan MmAllocateNodePagesForMdlEx tidak berdekatan. Penelepon dapat mengganti perilaku default rutinitas ini dengan mengatur bit bendera MM_ALLOCATE_PREFER_CONTIGUOUS atau MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS di parameter Bendera .
MmAllocateNodePagesForMdlEx tidak memetakan memori fisik yang dialokasikan ke dalam memori virtual. Jika perlu, penelepon dapat memanggil rutinitas seperti MmMapLockedPagesSpecifyCache untuk memetakan halaman memori fisik yang dijelaskan oleh MDL.
MmAllocateNodePagesForMdlEx 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).
Tergantung pada berapa banyak memori fisik yang saat ini tersedia dalam rentang yang diminta, MmAllocateNodePagesForMdlEx mungkin mengembalikan MDL yang menggambarkan 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, seperti yang dijelaskan oleh MDL.
Pemanggil harus menggunakan MmFreePagesFromMdl untuk merilis halaman memori yang dijelaskan oleh MDL yang dibuat oleh MmAllocateNodePagesForMdlEx. Setelah memanggil MmFreePagesFromMdl, pemanggil juga harus memanggil ExFreePool untuk merilis memori yang dialokasikan untuk struktur MDL.
Secara default, MmAllocateNodePagesForMdlEx mengisi halaman yang dialokasikan dengan nol. Penelepon dapat menentukan bendera MM_DONT_ZERO_ALLOCATION untuk mengambil alih default ini dan mungkin meningkatkan performa.
Memori yang dialokasikan MmAllocateNodePagesForMdlEx 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 kebocoran konten yang berpotensi istimewa). Untuk informasi selengkapnya tentang bendera ini, lihat MM_ALLOCATE_XXX.
Jumlah maksimum memori yang dapat dialokasikan mmAllocateNodePagesForMdlEx dalam satu panggilan adalah (4 gigabyte - PAGE_SIZE). Rutinitas dapat memenuhi permintaan alokasi untuk jumlah ini hanya jika tersedia halaman yang cukup.
MmAllocateNodePagesForMdlEx berjalan pada IRQL <= APC_LEVEL. Jika perlu, driver Anda dapat memanggil MmAllocateNodePagesForMdlEx di DISPATCH_LEVEL. Namun, Anda dapat meningkatkan performa driver dengan memanggil di APC_LEVEL atau di bawahnya.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Tersedia dimulai dengan Windows 8. |
Target Platform | Universal |
Header | wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h) |
Pustaka | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (Lihat bagian Keterangan.) |
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk