MmAllocateContiguousMemorySpecifyCacheNode 関数 (ntddk.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 は、すべてのメモリを 1 つのノードに属するものとして扱い、このノードからメモリを割り当てます。
MmAllocateContiguousMemorySpecifyCacheNode は、物理アドレス空間で連続する非ページ メモリのブロックを割り当てます。 ルーチンは、このブロックをシステム アドレス空間内の仮想メモリの連続したブロックにマップし、このブロックのベースの仮想アドレスを返します。 ルーチンは、連続したメモリ割り当ての開始アドレスをメモリ ページ境界に合わせます。
ドライバーは、要求された割り当てサイズを超えてメモリにアクセスすることはできません。 たとえば、開発者は、ドライバーが要求された割り当ての終了と次のページ境界の間でメモリを安全に使用できると想定しないでください。
通常、連続する物理メモリは不足しているため、必要な場合にのみ慎重に使用する必要があります。 オペレーティング システムがメモリを割り当てて解放すると、物理メモリが時間の経過と同時に断片化する可能性があるため、連続したメモリを使用する必要があるドライバーは、ドライバーの初期化中にこのメモリを割り当てる必要があります。 通常、ドライバーは DriverEntry ルーチンから MmAllocateContiguousMemorySpecifyCacheNode を呼び出して、長期間使用するために内部バッファーを割り当て、ドライバーがアンロードされる直前にバッファーを解放します。
MmAllocateContiguousMemorySpecifyCacheNode によって割り当てられたメモリは、メモリが不要になったときに解放する必要があります。 MmAllocateContiguousMemorySpecifyCacheNode によって割り当てられたメモリを解放するには、MmFreeContiguousMemory ルーチンを呼び出します。
BoundaryAddressMultiple パラメーターに 0 以外の値を指定した場合、割り当てられたメモリ ブロックの物理アドレス範囲は、この値の整数倍数であるアドレス境界を超えるわけではありません。 ハードウェアの制限を回避するために 0 以外の値が必要な場合を除き、ドライバーはこのパラメーターを 0 に設定する必要があります。 たとえば、デバイスが 16 メガバイトの物理境界を越えてデータを転送できない場合、ドライバーは、デバイスに表示されるアドレスが 16 メガバイトの境界でラップしないように、このパラメーターに 0x1000000 の値を指定する必要があります。
メモリの量が多いコンピューターで MmAllocateContiguousMemorySpecifyCacheNode ルーチンを使用すると、システムが連続するメモリ チャンクを作成しようとすると、オペレーティング システムのパフォーマンスが大幅に低下する可能性があります。 この低下は、Windows Vista SP1 と Windows Server 2008 以降では大幅に削減されますが、連続するメモリの割り当てにはコストがかかる場合があります。 このため、ドライバーは MmAllocateContiguousMemorySpecifyCacheNode の呼び出しを繰り返し回避する必要があります。 代わりに、ドライバーは、必要なすべての連続したバッファーを DriverEntry ルーチンに割り当て、これらのバッファーを再利用する必要があります。
MmAllocateContiguousMemorySpecifyCacheNode が割り当てるメモリは初期化されていません。 カーネル モード ドライバーは、このメモリをユーザー モード ソフトウェアに表示する場合 (特権のある可能性のあるコンテンツのリークを回避するため) 最初にゼロにする必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista 以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | ntddk.h (Wdm.h、Ntddk.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |