mmAllocateContiguousNodeMemory ルーチンは、連続した非ページ物理メモリの範囲を割り当て、システム アドレス空間にマップします。
構文
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
);
パラメーター
[in] NumberOfBytes
割り当てる連続したメモリのブロックのサイズ (バイト単位)。 詳細については、「解説」を参照してください。
[in] LowestAcceptableAddress
呼び出し元が使用できる有効な最小の物理アドレス。 たとえば、デバイスがプロセッサの物理メモリ アドレス範囲の最初の 8 メガバイトを超える場所のみをアドレス指定できる場合、このデバイスのドライバーは、lowestAcceptableAddress 0x0000000000800000に設定する必要があります。
[in] HighestAcceptableAddress
呼び出し元が使用できる最も有効な物理アドレス。 たとえば、デバイスがプロセッサの物理メモリ アドレス範囲の最初の 16 メガバイトの場所のみをアドレス指定できる場合、このデバイスのドライバーは、highestAcceptableAddress 0x0000000000FFFFFFに設定する必要があります。
[in, optional] BoundaryAddressMultiple
割り当てられたバッファーが交差してはならない物理アドレスの倍数。 複数の物理アドレスは、常に 2 の累乗である必要があります。 このパラメーターは省略可能であり、デバイスに特別なメモリ境界制限がないことを示す 0 として指定できます。 詳細については、「解説」を参照してください。
[in] Protect
割り当てられたメモリに使用する保護を指定するフラグ ビット。 呼び出し元は、Protect パラメーターで、次のフラグ ビットの 1 つ (両方ではなく) を設定する必要があります。
フラグ ビット | 意味 |
---|---|
PAGE_READWRITE | 読み取り/書き込み、実行なし (NX) メモリを割り当てます。 ほとんどの呼び出し元は、このフラグ ビットを設定する必要があります。 詳細については、「解説」を参照してください。 |
PAGE_EXECUTE_READWRITE | 実行可能な読み取り/書き込みメモリを割り当てます。 このフラグ ビットは、呼び出し元が割り当てられたメモリ内で命令を実行する必要がある場合にのみ設定する必要があります。 |
さらに、呼び出し元は、Protect パラメーターに次の省略可能なフラグ ビットの 1 つ (両方ではなく) を設定できます。
フラグ ビット | 意味 |
---|---|
PAGE_NOCACHE | キャッシュされていないメモリを割り当てます。 このフラグ ビットは、CacheType が mmNonCached に設定 mmAllocateContiguousMemorySpecifyCache呼び出すのと同じです。 |
PAGE_WRITECOMBINE | 書き込み結合メモリを割り当てます。 このフラグ ビットは、CacheType を mmWriteCombined に設定 mmAllocateContiguousMemorySpecifyCache呼び出すのと実質的に似ています。 |
PAGE_NOCACHEもPAGE_WRITECOMBINEも指定されていない場合、割り当てられたメモリは完全にキャッシュされます。 この場合、効果は、CacheType が mmCached に設定 mmAllocateContiguousMemorySpecifyCache呼び出すことと似ています。
[in] PreferredNode
優先ノード番号。 マルチプロセッサ システムに N 個のノードが含まれている場合、ノードには 0 から N-1 の番号が付けられます。 呼び出し元 PreferredNode をMM_ANY_NODE_OKに設定すると、ルーチンはメモリを割り当てるノードを選択します。 それ以外の場合、指定したアドレス範囲のメモリを優先ノードから割り当てることができない場合、ルーチンは null 返します。
戻り値
MmAllocateContiguousNodeMemory は、割り当てられたメモリのベース仮想アドレスを返します。 要求を満たすことができない場合、ルーチンは NULL 返します。
備考
カーネル モード デバイス ドライバーは、物理メモリの連続したブロックを割り当てるために、このルーチンを呼び出します。 呼び出し元のドライバーは、割り当てに実行なし (NX) メモリを使用するかどうかを指定できます。 非均一メモリ アクセス (NUMA) マルチプロセッサ システムでは、呼び出し元はメモリを割り当てる優先ノードを指定できます。 ノードは、メモリ領域への高速アクセスを共有するプロセッサのコレクションです。 NUMA 以外のマルチプロセッサ システムまたは単一プロセッサ システムでは、mmAllocateContiguousNodeMemory は、すべてのメモリを単一ノードに属するものとして扱い、このノードからメモリを割り当てます。
mmAllocateContiguousNodeMemory は、物理アドレス空間で連続する非ページ メモリのブロックを割り当てます。 ルーチンは、このブロックをシステム・アドレス・スペース内の連続した仮想メモリー・ブロックにマップし、このブロックのベースの仮想アドレスを戻します。 このルーチンは、連続したメモリ割り当ての開始アドレスをメモリ ページの境界に合わせます。
ドライバーは、要求された割り当てサイズを超えてメモリにアクセスすることはできません。 たとえば、開発者は、ドライバーが要求された割り当ての終了から次のページ境界までの間にメモリを安全に使用できると想定しないでください。
連続した物理メモリは通常、不足しているため、必要な場合にのみ慎重に使用する必要があります。 連続したメモリを使用する必要があるドライバーは、オペレーティング システムがメモリを割り当てて解放すると、物理メモリが時間の経過と同時に断片化する可能性があるため、ドライバーの初期化中にこのメモリを割り当てる必要があります。 通常、ドライバーは、DriverEntry ルーチンから mmAllocateContiguousNodeMemory を呼び出して、長期間使用するために内部バッファーを割り当て、ドライバーがアンロードされる直前にバッファーを解放します。
MmAllocateContiguousNodeMemory によって割り当てられたメモリは、メモリが不要になったときに解放する必要があります。 MmFreeContiguousMemory ルーチンを呼び出して、mmAllocateContiguousNodeMemoryによって割り当てられたメモリを解放します。
mmAllocateContiguousNodeMemory は、mmAllocateContiguousMemorySpecifyCacheNode ルーチンに似ています。 mmAllocateContiguousMemorySpecifyCacheNode とは異なり、MmAllocateContiguousNodeMemory を使用して、実行なし (NX) メモリを割り当てることができます。 ベスト プラクティスとして、ドライバーは、割り当てられたメモリ内で命令を実行する機能を明示的に要求しない限り、NX メモリを割り当てる必要があります。 NX メモリを割り当てることで、ドライバーは、悪意のあるソフトウェアがこのメモリ内の命令を実行するのを防ぐことで、セキュリティを向上させます。 MmAllocateContiguousMemory、MmAllocateContiguousMemorySpecifyCache、および mmAllocateContiguousMemorySpecifyCache Node によって割り当てられたメモリは、常に実行可能です。
BoundaryAddressMultiple パラメーターに 0 以外の値を指定した場合、割り当てられたメモリ ブロックの物理アドレス範囲は、この値の整数倍数であるアドレス境界を超えるわけではありません。 ハードウェアの制限を回避するために 0 以外の値が必要な場合を除き、ドライバーは、このパラメーターを 0 に設定する必要があります。 たとえば、デバイスが 16 メガバイトの物理境界を越えてデータを転送できない場合、ドライバーは、デバイスに表示されるアドレスが 16 MB の境界で折り返されないように、このパラメーターの0x1000000の値を指定する必要があります。
mmAllocateContiguousNodeMemory が割り当てる メモリは初期化されていません。 カーネル モード ドライバーは、ユーザー モード のソフトウェアに表示する場合は、このメモリを最初にゼロにする必要があります (潜在的に特権のあるコンテンツのリークを回避するため)。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 8 以降で使用できます。 |
ターゲット プラットフォーム の | 万国 |
ヘッダー | wdm.h (Wdm.h、Ntddk.h を含む) |
ライブラリ | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
関連項目
mmAllocateContiguousMemory の
mmAllocateContiguousMemorySpecifyCache の