MmAllocateContiguousMemory 関数 (wdm.h)
MmAllocateContiguousMemory ルーチンは、連続する非ページ物理メモリの範囲を割り当て、システム アドレス空間にマップします。
構文
PVOID MmAllocateContiguousMemory(
[in] SIZE_T NumberOfBytes,
[in] PHYSICAL_ADDRESS HighestAcceptableAddress
);
パラメーター
[in] NumberOfBytes
割り当てる連続したメモリのブロックのサイズ (バイト単位)。 詳細については、「解説」を参照してください。
[in] HighestAcceptableAddress
呼び出し元が使用できる最も有効な物理アドレス。 たとえば、デバイスがプロセッサの物理メモリ アドレス範囲の最初の 16 メガバイト内の場所のみをアドレス指定できる場合、このデバイスのドライバーは HighestAcceptableAddress を0x0000000000FFFFFFに設定する必要があります。 メモリ割り当ての特定の要件がない場合は、 を MAXULONG64 に設定します。
戻り値
MmAllocateContiguousMemory は、割り当てられたメモリのベース仮想アドレスを返します。 要求を満たすことができない場合、ルーチンは NULL を返します。
注釈
MmAllocateContiguousMemory は、物理アドレス空間で連続する非ページ メモリのブロックを割り当てます。 ルーチンは、このブロックをシステム アドレス空間内の仮想メモリの連続したブロックにマップし、このブロックのベースの仮想アドレスを返します。 ルーチンは、連続したメモリ割り当ての開始アドレスをメモリ ページ境界に合わせます。
ドライバーは、要求された割り当てサイズを超えてメモリにアクセスすることはできません。 たとえば、開発者は、ドライバーが要求された割り当ての終了と次のページ境界の間でメモリを安全に使用できると想定しないでください。
通常、連続する物理メモリは不足しているため、必要な場合にのみ慎重に使用する必要があります。 オペレーティング システムがメモリを割り当てて解放すると、物理メモリが時間の経過と同時に断片化する可能性があるため、連続したメモリを使用する必要があるドライバーは、ドライバーの初期化中にこのメモリを割り当てる必要があります。 通常、ドライバーは、長期間使用するために内部バッファーを割り当てる DriverEntry ルーチンから MmAllocateContiguousMemory を呼び出し、ドライバーがアンロードされる直前にバッファーを解放します。
MmAllocateContiguousMemory によって割り当てられたメモリは、メモリが不要になったときに解放する必要があります。 MmAllocateContiguousMemory によって割り当てられたメモリを解放するには、MmFreeContiguousMemory ルーチンを呼び出します。
大量の RAM を持つコンピューターで物理メモリが断片化されている場合、オペレーティング システムが連続するメモリ ブロックを検索する必要がある MmAllocateContiguousMemory を呼び出すと、パフォーマンスが大幅に低下する可能性があります。 この低下は、Windows Vista SP1 と Windows Server 2008 以降では大幅に削減されますが、連続するメモリの割り当てにはコストがかかる場合があります。 このため、ドライバーは MmAllocateContiguousMemory への繰り返しの呼び出しを避ける必要があります。 代わりに、ドライバーは、必要なすべての連続したバッファーを DriverEntry ルーチンに割り当て、これらのバッファーを再利用する必要があります。
MmAllocateContiguousMemory によって割り当てられるメモリが初期化されていません。 カーネル モード ドライバーは、ユーザー モード のソフトウェアに表示する場合 (特権の可能性のあるコンテンツのリークを回避するために) このメモリを最初に 0 に設定する必要があります。
要件
要件 | 値 |
---|---|
対象プラットフォーム | ユニバーサル |
Header | wdm.h (Wdm.h、Ntddk.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |