MmAllocateContiguousMemorySpecifyCacheNode 関数 (wdm.h)
mmAllocateContiguousMemorySpecifyCacheNode ルーチンは、連続した非ページ物理メモリの範囲を割り当て、システム アドレス空間にマップします。
構文
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
);
パラメーター
[in] NumberOfBytes
割り当てる連続したメモリのブロックのサイズ (バイト単位)。 詳細については、後述の「解説」セクションを参照してください。
[in] LowestAcceptableAddress
呼び出し元が使用できる有効な最小の物理アドレス。 たとえば、デバイスがプロセッサの物理メモリ アドレス範囲の最初の 8 メガバイトを超える場所のみをアドレス指定できる場合、このデバイスのドライバーは、lowestAcceptableAddress 0x0000000000800000に設定する必要があります。
[in] HighestAcceptableAddress
呼び出し元が使用できる最も有効な物理アドレス。 たとえば、デバイスがプロセッサの物理メモリ アドレス範囲の最初の 16 メガバイトの場所のみをアドレス指定できる場合、このデバイスのドライバーは、highestAcceptableAddress 0x0000000000FFFFFFに設定する必要があります。
[in, optional] BoundaryAddressMultiple
割り当てられたバッファーが交差してはならない物理アドレスの倍数。 複数の物理アドレスは、常に 2 の累乗である必要があります。 このパラメーターは省略可能であり、デバイスに特別なメモリ境界制限がないことを示す 0 として指定できます。 詳細については、「解説」を参照してください。
[in] CacheType
連続した物理メモリに対して要求されたキャッシュの種類を示す MEMORY_CACHING_TYPE 値を指定します。
[in] PreferredNode
優先ノード番号。 マルチプロセッサ システムに N 個のノードが含まれている場合、ノードには 0 から N-1 の番号が付けられます。 MM_ANY_NODE_OKが指定されている場合、またはマシンにノードが 1 つしかない場合、割り当ては任意のノードから満たされます。 それ以外の場合、優先ノードから割り当てが行われるか、優先ノードから十分な範囲が見つからない場合は、NULL が返されます。
戻り値
MmAllocateContiguousMemorySpecifyCacheNode は、割り当てられたメモリのベース仮想アドレスを返します。 要求を満たすことができない場合、ルーチンは NULL 返します。
備考
カーネル モード デバイス ドライバーは、物理メモリの連続したブロックを割り当てるために、このルーチンを呼び出します。 非均一メモリ アクセス (NUMA) マルチプロセッサ システムでは、呼び出し元はメモリを割り当てる優先ノードを指定できます。 ノードは、メモリ領域への高速アクセスを共有するプロセッサのコレクションです。 NUMA 以外のマルチプロセッサ システムまたは単一プロセッサ システムでは、mmAllocateContiguousMemorySpecifyCacheNode は、すべてのメモリを単一ノードに属するものとして処理し、このノードからメモリを割り当てます。
mmAllocateContiguousMemorySpecifyCacheNode 、物理アドレス空間で連続する非ページ メモリのブロックを割り当てます。 ルーチンは、このブロックをシステム・アドレス・スペース内の連続した仮想メモリー・ブロックにマップし、このブロックのベースの仮想アドレスを戻します。 このルーチンは、連続したメモリ割り当ての開始アドレスをメモリ ページの境界に合わせます。
ドライバーは、要求された割り当てサイズを超えてメモリにアクセスすることはできません。 たとえば、開発者は、ドライバーが要求された割り当ての終了から次のページ境界までの間にメモリを安全に使用できると想定しないでください。
連続した物理メモリは通常、不足しているため、必要な場合にのみ慎重に使用する必要があります。 連続したメモリを使用する必要があるドライバーは、オペレーティング システムがメモリを割り当てて解放すると、物理メモリが時間の経過と同時に断片化する可能性があるため、ドライバーの初期化中にこのメモリを割り当てる必要があります。 通常、ドライバーは、DriverEntry ルーチンから mmAllocateContiguousMemorySpecifyCacheNode を呼び出して、長期間使用するために内部バッファーを割り当て、ドライバーがアンロードされる直前にバッファーを解放します。
MmAllocateContiguousMemorySpecifyCacheNode によって割り当てられたメモリは、メモリが不要になったときに解放する必要があります。 MmFreeContiguousMemory ルーチンを呼び出して、mmAllocateContiguousMemorySpecifyCacheNode によって割り当てられたメモリ解放します。
BoundaryAddressMultiple パラメーターに 0 以外の値を指定した場合、割り当てられたメモリ ブロックの物理アドレス範囲は、この値の整数倍数であるアドレス境界を超えるわけではありません。 ハードウェアの制限を回避するために 0 以外の値が必要な場合を除き、ドライバーは、このパラメーターを 0 に設定する必要があります。 たとえば、デバイスが 16 メガバイトの物理境界を越えてデータを転送できない場合、ドライバーは、デバイスに表示されるアドレスが 16 MB の境界で折り返されないように、このパラメーターの0x1000000の値を指定する必要があります。
大量のメモリを持つコンピューターで MmAllocateContiguousMemorySpecifyCacheNode ルーチンを使用すると、システムが連続するメモリ チャンクを作成しようとしたときに、オペレーティング システムのパフォーマンスが大幅に低下する可能性があります。 この低下は、Windows Vista SP1 および Windows Server 2008 以降では大幅に削減されますが、連続したメモリは割り当てにコストがかかる場合があります。 このため、ドライバーは、mmAllocateContiguousMemorySpecifyCacheNode 繰り返し呼び出しを回避する必要があります。 代わりに、ドライバーは、DriverEntry ルーチンに必要なすべての連続したバッファーを割り当て、これらのバッファーを再利用する必要があります。
割り当て mmAllocateContiguousMemorySpecifyCacheNode メモリは初期化されていません。 カーネル モード ドライバーは、ユーザー モード のソフトウェアに表示する場合は、このメモリを最初にゼロにする必要があります (潜在的に特権のあるコンテンツのリークを回避するため)。
必要条件
要件 | 価値 |
---|---|
ターゲット プラットフォーム の | 万国 |
ヘッダー | wdm.h (Wdm.h、Ntddk.h を含む) |
ライブラリ | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |