Fungsi MmAllocatePagesForMdl (wdm.h)

Rutinitas MmAllocatePagesForMdl mengalokasikan halaman memori fisik yang tidak terisi nol dan tidak terisi ke MDL.

Sintaks

PMDL MmAllocatePagesForMdl(
  [in] PHYSICAL_ADDRESS LowAddress,
  [in] PHYSICAL_ADDRESS HighAddress,
  [in] PHYSICAL_ADDRESS SkipBytes,
  [in] SIZE_T           TotalBytes
);

Parameter

[in] LowAddress

Menentukan alamat fisik awal rentang alamat pertama tempat halaman yang dialokasikan dapat berasal. Jika MmAllocatePagesForMdl tidak dapat mengalokasikan jumlah byte yang diminta dalam rentang alamat pertama, iterasi melalui rentang alamat tambahan untuk mendapatkan lebih banyak halaman. Pada setiap perulangan, MmAllocatePagesForMdl menambahkan nilai SkipBytes ke alamat awal sebelumnya untuk mendapatkan awal rentang alamat berikutnya.

[in] HighAddress

Menentukan alamat fisik akhir rentang alamat pertama tempat halaman yang dialokasikan dapat berasal.

[in] SkipBytes

Menentukan jumlah byte yang akan dilewati dari awal rentang alamat sebelumnya dari mana halaman yang dialokasikan bisa datang. SkipBytes harus berupa bilangan bulat kelipatan ukuran halaman memori virtual, dalam byte.

[in] TotalBytes

Menentukan jumlah total byte yang akan dialokasikan untuk MDL.

Nilai kembali

MmAllocatePagesForMdl mengembalikan salah satu hal berikut:

Menampilkan kode Deskripsi
Penunjuk MDL Penunjuk MDL menjelaskan sekumpulan halaman fisik dalam rentang alamat yang ditentukan. Jika jumlah byte yang diminta tidak tersedia, MDL menjelaskan memori fisik sebanyak yang tersedia.
NULL Tidak ada halaman memori fisik dalam rentang alamat yang ditentukan, atau tidak ada cukup kumpulan memori untuk MDL itu sendiri.

Keterangan

Driver yang berjalan di Windows Server 2003 Service Pack 1 (SP1) dan versi Windows yang lebih baru harus menggunakan rutinitas MmAllocatePagesForMdlEx alih-alih MmAllocatePagesForMdl. MmAllocatePagesForMdlEx memberikan performa yang lebih baik daripada MmAllocatePagesForMdl dengan menghindari flush yang tidak perlu dari buffer lookaside terjemahan (TLB) dan memori cache.

Halaman memori fisik yang dikembalikan oleh MmAllocatePagesForMdl biasanya bukan halaman yang berdampingan. MmAllocatePagesForMdl selalu mengisi halaman yang dialokasikan dalam MDL yang dikembalikan dengan nol.

MmAllocatePagesForMdl dirancang untuk digunakan oleh driver mode kernel yang tidak memerlukan alamat virtual yang sesuai (yaitu, mereka membutuhkan halaman fisik dan tidak memerlukan halaman untuk berdekatan secara fisik) atau oleh driver mode kernel yang dapat mencapai perolehan performa substansial jika memori fisik untuk perangkat dialokasikan dalam rentang alamat fisik tertentu. Driver untuk kartu grafis AGP adalah contoh driver seperti itu.

Bergantung pada berapa banyak memori fisik yang saat ini tersedia dalam rentang yang diminta, MmAllocatePagesForMdl mungkin mengembalikan MDL yang menjelaskan lebih sedikit memori daripada yang diminta. Rutinitas 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 MmAllocatePagesForMdl. Setelah memanggil MmFreePagesFromMdl, pemanggil juga harus memanggil ExFreePool untuk merilis memori yang dialokasikan untuk struktur MDL itu sendiri.

Di Windows 2000 dan versi Windows yang lebih baru, jumlah maksimum memori yang dapat dialokasikan MmAllocatePagesForMdl dalam satu panggilan adalah (4 gigabyte - PAGE_SIZE). Rutinitas dapat memenuhi permintaan alokasi untuk jumlah ini hanya jika tersedia cukup halaman.

MmAllocatePagesForMdl berjalan di IRQL <= APC_LEVEL. Windows Server 2008 dan versi yang lebih baru dari sistem operasi Windows memungkinkan pemanggil MmAllocatePagesForMdl untuk memanggil di DISPATCH_LEVEL. Namun, Anda dapat meningkatkan performa driver dengan memanggil di APC_LEVEL atau di bawahnya.

Memanggil MmAllocatePagesForMdl dari panggilan prosedur asinkron kernel khusus (APC) dapat menyebabkan akuisisi rekursif kunci eksklusif, yang hanya berada di wilayah penting (APC kernel pengguna atau normal dinonaktifkan) tetapi tidak di wilayah yang dijaga (semua APC dinonaktifkan).

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 HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm), SpNoWait(storport), StorPortStartIo(storport)

Lihat juga

ExFreePool

MmAllocatePagesForMdlEx

MmFreePagesFromMdl

MmMapLockedPages