Fungsi MmAllocateContiguousNodeMemory (wdm.h)

MmAllocateContiguousNodeMemory rutin mengalokasikan berbagai memori fisik yang berdekatan dan tidak dipetakan ke ruang alamat sistem.

Sintaksis

C++
PVOID MmAllocateContiguousNodeMemory(
  [in]           SIZE_T           NumberOfBytes,
  [in]           PHYSICAL_ADDRESS LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
  [in]           ULONG            Protect,
  [in]           NODE_REQUIREMENT PreferredNode
);

Parameter

[in] NumberOfBytes

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

[in] LowestAcceptableAddress

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

[in] HighestAcceptableAddress

Alamat fisik tertinggi yang valid 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.

[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] Protect

Bit bendera yang menentukan perlindungan yang akan digunakan untuk memori yang dialokasikan. Pemanggil harus mengatur satu (tetapi tidak keduanya) dari bit bendera berikut dalam parameter Lindungi.

Bendera bit Arti
PAGE_READWRITE Alokasikan memori baca/tulis, tanpa eksekusi (NX). Sebagian besar penelepon harus mengatur bit bendera ini. Untuk informasi selengkapnya, lihat Keterangan.
PAGE_EXECUTE_READWRITE Alokasikan memori baca/tulis yang dapat dieksekusi. Bit bendera ini harus diatur hanya jika pemanggil memerlukan kemampuan untuk menjalankan instruksi dalam memori yang dialokasikan.

Selain itu, pemanggil dapat mengatur satu (tetapi tidak keduanya) dari bit bendera opsional berikut dalam parameter Lindungi.

Bendera bit Arti
PAGE_NOCACHE Alokasikan memori yang tidak di-cache. Bit bendera ini mirip dengan memanggil MmAllocateContiguousMemorySpecifyCache dengan CacheType diatur ke MmNonCached.
PAGE_WRITECOMBINE Alokasikan memori gabungan tulis. Bit bendera ini mirip dengan memanggil MmAllocateContiguousMemorySpecifyCache dengan CacheType diatur ke MmWriteCombined.

Jika tidak PAGE_NOCACHE atau PAGE_WRITECOMBINE ditentukan, memori yang dialokasikan sepenuhnya di-cache. Dalam hal ini, efeknya mirip dengan memanggil MmAllocateContiguousMemorySpecifyCache dengan CacheType diatur ke MmCached.

[in] PreferredNode

Nomor simpul yang disukai. Jika sistem multiprosedur berisi simpul N, simpul diberi nomor dari 0 hingga N-1. Jika penelepon mengatur PreferredNode ke MM_ANY_NODE_OK, rutinitas memilih simpul mana yang akan dialokasikan memorinya. Jika tidak, jika memori dalam rentang alamat yang ditentukan tidak dapat dialokasikan dari simpul pilihan, rutinitas mengembalikan NULL.

Mengembalikan nilai

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

Komentar

Driver perangkat mode kernel memanggil rutinitas ini untuk mengalokasikan blok memori fisik yang berdampingan. Driver panggilan dapat menentukan apakah akan menggunakan memori tanpa eksekusi (NX) untuk alokasi. 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, MmAllocateContiguousNodeMemory memperlakukan semua memori sebagai milik satu simpul dan mengalokasikan memori dari simpul ini.

MmAllocateContiguousNodeMemory mengalokasikan blok memori yang tidak disebarkan 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 pendek, itu 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 MmAllocateContiguousNodeMemory dari DriverEntry rutin untuk mengalokasikan buffer internal untuk penggunaan jangka panjang, dan membebaskan buffer tepat sebelum driver dibongkar.

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

MmAllocateContiguousNodeMemory mirip dengan MmAllocateContiguousMemorySpecifyCacheNode rutinitas. Tidak seperti MmAllocateContiguousMemorySpecifyCacheNode, MmAllocateContiguousNodeMemory dapat digunakan untuk mengalokasikan memori no-execute (NX). Sebagai praktik terbaik, driver harus mengalokasikan memori NX kecuali driver secara eksplisit membutuhkan kemampuan untuk menjalankan instruksi dalam memori yang dialokasikan. Dengan mengalokasikan memori NX, driver meningkatkan keamanan dengan mencegah perangkat lunak berbahaya menjalankan instruksi dalam memori ini. Memori yang dialokasikan oleh MmAllocateContiguousMemory, MmAllocateContiguousMemorySpecifyCache, dan MmAllocateContiguousMemorySpecifyCacheNode rutinitas selalu dapat dieksekusi.

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 terbungkus pada batas 16 megabyte.

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

Persyaratan

Syarat Nilai
klien minimum yang didukung Tersedia dimulai dengan Windows 8.
Platform Target Universal
Header wdm.h (termasuk Wdm.h, Ntddk.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

Lihat juga

DriverEntry

MmAllocateContiguousMemory

MmAllocateContiguousMemorySpecifyCache

MmAllocateContiguousMemorySpecifyCacheNode

MmFreeContiguousMemory