Fungsi MmAllocateContiguousMemorySpecifyCacheNode (wdm.h)

Rutinitas MmAllocateContiguousMemorySpecifyCacheNode mengalokasikan berbagai memori fisik yang berdekatan dan tidak bertepatan dan memetakannya ke ruang alamat sistem.

Sintaks

PVOID MmAllocateContiguousMemorySpecifyCacheNode(
  [in]           SIZE_T              NumberOfBytes,
  [in]           PHYSICAL_ADDRESS    LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS    HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS    BoundaryAddressMultiple,
  [in]           MEMORY_CACHING_TYPE CacheType,
  [in]           NODE_REQUIREMENT    PreferredNode
);

Parameter

[in] NumberOfBytes

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

[in] LowestAcceptableAddress

Alamat fisik terendah yang dapat digunakan pemanggil. Misalnya, jika perangkat hanya dapat mengatasi lokasi di atas 8 megabyte pertama dari rentang alamat memori fisik prosesor, driver untuk perangkat ini harus mengatur LowestAcceptableAddress ke 0x0000000000800000.

[in] HighestAcceptableAddress

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

[in, optional] BoundaryAddressMultiple

Alamat fisik beberapa yang tidak boleh dilintasi oleh buffer yang dialokasikan. Kelipatan alamat fisik harus selalu menjadi kekuatan dua. Parameter ini bersifat opsional dan dapat ditentukan sebagai nol untuk menunjukkan bahwa perangkat tidak memiliki batasan batas memori khusus. Untuk informasi selengkapnya, lihat Keterangan.

[in] CacheType

Menentukan nilai MEMORY_CACHING_TYPE , yang menunjukkan jenis penembolokan yang diminta untuk memori fisik yang bersebelahan.

[in] PreferredNode

Nomor simpul yang disukai. Jika sistem multiprosedur berisi simpul N, simpul diberi nomor 0 hingga N-1. Jika MM_ANY_NODE_OK ditentukan atau komputer hanya memiliki satu simpul, maka alokasi terpenuhi dari simpul apa pun. Jika tidak, alokasi dibuat dari simpul pilihan atau jika rentang yang memuaskan tidak dapat ditemukan dari simpul pilihan, maka NULL dikembalikan.

Mengembalikan nilai

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

Keterangan

Driver perangkat mode kernel memanggil rutinitas ini untuk mengalokasikan blok memori fisik yang berdampingan. Dalam sistem multiprosesor akses memori non-seragam (NUMA), pemanggil dapat menentukan simpul pilihan untuk mengalokasikan memori. Simpul adalah kumpulan prosesor yang berbagi akses cepat ke wilayah memori. Dalam multiprosesor non-NUMA atau sistem prosesor tunggal, MmAllocateContiguousMemorySpecifyCacheNode memperlakukan semua memori sebagai milik satu simpul dan mengalokasikan memori dari simpul ini.

MmAllocateContiguousMemorySpecifyCacheNode mengalokasikan blok memori tidak bersebelahan yang berdekatan 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 ke 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 singkat, memori fisik harus digunakan dengan hemat dan hanya jika perlu. Driver yang harus menggunakan memori yang berdekatan harus mengalokasikan memori ini selama inisialisasi driver karena memori fisik cenderung menjadi terfragmentasi dari waktu ke waktu saat sistem operasi mengalokasikan dan membebaskan memori. Biasanya, driver memanggil MmAllocateContiguousMemorySpecifyCacheNode dari rutinitas DriverEntry-nya untuk mengalokasikan buffer internal untuk penggunaan jangka panjang, dan membebaskan buffer tepat sebelum driver dibongkar.

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

Jika Anda menentukan nilai bukan nol untuk parameter BoundaryAddressMultiple , rentang alamat fisik blok memori yang dialokasikan tidak akan melewati batas alamat yang merupakan kelipatan bilangan bulat dari nilai ini. Driver harus mengatur parameter ini ke nol kecuali nilai bukan nol diperlukan untuk mengatasi batasan perangkat keras. Misalnya, jika perangkat tidak dapat mentransfer data di seluruh batas fisik 16 megabyte, driver harus menentukan nilai 0x1000000 untuk parameter ini untuk memastikan bahwa alamat yang dilihat perangkat tidak dibungkus pada batas 16 megabyte.

Jika Anda menggunakan rutinitas MmAllocateContiguousMemorySpecifyCacheNode pada komputer dengan memori dalam jumlah besar, performa sistem operasi mungkin sangat menurur ketika sistem mencoba membuat potongan memori yang berdekatan. 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 MmAllocateContiguousMemorySpecifyCacheNode. Sebagai gantinya, driver harus mengalokasikan semua buffer yang berdampingan yang diperlukan dalam rutinitas DriverEntry mereka dan menggunakan kembali buffer ini.

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

Persyaratan

Persyaratan Nilai
Target Platform Universal
Header wdm.h (termasuk Wdm.h, Ntddk.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

Lihat juga

DriverEntry

MEMORY_CACHING_TYPE

MmFreeContiguousMemory