Fungsi MmAllocateContiguousMemory (ntddk.h)

Rutinitas MmAllocateContiguousMemory mengalokasikan berbagai memori fisik yang berdampingan dan tidak dipetakan ke ruang alamat sistem.

Sintaks

PVOID MmAllocateContiguousMemory(
  [in] SIZE_T           NumberOfBytes,
  [in] PHYSICAL_ADDRESS HighestAcceptableAddress
);

Parameter

[in] NumberOfBytes

Ukuran, dalam byte, dari blok memori yang berdampingan untuk dialokasikan. Untuk informasi selengkapnya, lihat Keterangan.

[in] HighestAcceptableAddress

Alamat fisik valid tertinggi yang dapat digunakan pemanggil. Misalnya, jika perangkat hanya dapat mengatasi lokasi dalam 16 megabyte pertama rentang alamat memori fisik prosesor, driver untuk perangkat ini harus mengatur HighestAcceptableAddress ke 0x0000000000FFFFFF.

Mengembalikan nilai

MmAllocateContiguousMemory mengembalikan alamat virtual dasar untuk memori yang dialokasikan. Jika permintaan tidak dapat dipenuhi, rutinitas mengembalikan NULL.

Keterangan

MmAllocateContiguousMemory mengalokasikan blok memori tidak bertumpuk yang berdampingan di ruang alamat fisik. Rutin memetakan blok ini ke blok memori virtual yang berdampingan di ruang alamat sistem dan mengembalikan alamat virtual dasar blok ini. Rutinitas menyelaraskan alamat awal alokasi memori yang berdekatan dengan batas halaman memori.

Driver tidak boleh mengakses memori di luar ukuran alokasi yang diminta. Misalnya, pengembang tidak boleh berasumsi bahwa driver mereka dapat dengan aman menggunakan memori antara akhir alokasi yang diminta dan batas halaman berikutnya.

Karena memori fisik yang berdampingan biasanya dalam pasokan pendek, memori tersebut harus digunakan dengan hemat dan hanya jika perlu. Driver yang harus menggunakan memori yang berdampingan harus mengalokasikan memori ini selama inisialisasi driver karena memori fisik cenderung menjadi terfragmentasi dari waktu ke waktu karena sistem operasi mengalokasikan dan membebaskan memori. Biasanya, driver memanggil MmAllocateContiguousMemory dari rutinitas DriverEntry-nya untuk mengalokasikan buffer internal untuk penggunaan jangka panjang, dan membebaskan buffer tepat sebelum driver dibongkar.

Memori yang dialokasikan oleh MmAllocateContiguousMemory harus dikosongkan ketika memori tidak lagi diperlukan. Panggil rutinitas MmFreeContiguousMemory untuk membebaskan memori yang dialokasikan oleh MmAllocateContiguousMemory.

Ketika memori fisik terfragmentasi pada komputer yang memiliki sejumlah besar RAM, panggilan ke MmAllocateContiguousMemory, yang mengharuskan sistem operasi untuk mencari blok memori yang berdekatan, dapat sangat menurunkan performa. Degradasi ini sangat berkurang dimulai dengan Windows Vista SP1 dan Windows Server 2008, tetapi memori yang berdekatan masih bisa mahal untuk dialokasikan. Untuk alasan ini, driver harus menghindari panggilan berulang ke MmAllocateContiguousMemory. Sebaliknya, driver harus mengalokasikan semua buffer yang berdampingan yang diperlukan dalam rutinitas DriverEntry mereka dan menggunakan kembali buffer ini.

Memori yang dialokasikan MmAllocateContiguousMemory tidak diinisialisasi. Driver mode kernel harus terlebih dahulu mengatur memori ini ke nol jika akan membuatnya terlihat oleh perangkat lunak mode pengguna (untuk menghindari bocornya konten yang berpotensi istimewa).

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Tersedia dimulai dengan Windows 2000.
Target Platform Universal
Header ntddk.h (termasuk Wdm.h, Ntddk.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Lihat juga

AllocateCommonBuffer

DriverEntry

MmAllocateContiguousMemorySpecifyCache

MmAllocateNonCachedMemory

MmFreeContiguousMemory