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

ExFreePool

KeQueryHighestNodeNumber

MDL

MEMORY_CACHING_TYPE

MM_ALLOCATE_XXX

MmFreePagesFromMdl

MmMapLockedPagesSpecifyCache