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
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