次の方法で共有


MmAllocateContiguousNodeMemory 関数 (ntddk.h)

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 キャッシュされていないメモリを割り当てます。 このフラグ ビットは、CacheTypeMmNonCached に設定された MmAllocateContiguousMemorySpecifyCache を呼び出すのと同様です。
PAGE_WRITECOMBINE 書き込み結合メモリを割り当てます。 このフラグ ビットは、CacheTypeMmWriteCombined に設定された MmAllocateContiguousMemorySpecifyCache を呼び出すことと同様です。

PAGE_NOCACHEもPAGE_WRITECOMBINEも指定されていない場合、割り当てられたメモリは完全にキャッシュされます。 この場合、効果は、CacheTypeMmCached に設定された MmAllocateContiguousMemorySpecifyCache の呼び出しに似ています。

[in] PreferredNode

優先ノード番号。 マルチプロセッサ システムに N 個のノードが含まれている場合、ノードの番号は 0 から N-1 になります。 呼び出し元 が PreferredNode をMM_ANY_NODE_OKに設定した場合、ルーチンはメモリを割り当てるノードを選択します。 それ以外の場合、指定したアドレス範囲のメモリを優先ノードから割り当てることができない場合、ルーチンは NULL を返します。

戻り値

MmAllocateContiguousNodeMemory は、割り当てられたメモリのベース仮想アドレスを返します。 要求を満たすことができない場合、ルーチンは NULL を返します。

注釈

カーネル モードのデバイス ドライバーは、このルーチンを呼び出して、物理メモリの連続したブロックを割り当てます。 呼び出し元のドライバーは、割り当てに実行なし (NX) メモリを使用するかどうかを指定できます。 非均一メモリ アクセス (NUMA) マルチプロセッサ システムでは、呼び出し元はメモリを割り当てる優先ノードを指定できます。 ノードは、メモリの領域への高速アクセスを共有するプロセッサのコレクションです。 NUMA 以外のマルチプロセッサまたは単一プロセッサ システムでは、 MmAllocateContiguousNodeMemory は、すべてのメモリを 1 つのノードに属するものとして扱い、このノードからメモリを割り当てます。

MmAllocateContiguousNodeMemory は、物理アドレス空間で連続する非ページ メモリのブロックを割り当てます。 ルーチンは、このブロックをシステム アドレス空間内の仮想メモリの連続したブロックにマップし、このブロックのベースの仮想アドレスを返します。 ルーチンは、連続したメモリ割り当ての開始アドレスをメモリ ページ境界に合わせます。

ドライバーは、要求された割り当てサイズを超えてメモリにアクセスすることはできません。 たとえば、開発者は、ドライバーが要求された割り当ての終了と次のページ境界の間でメモリを安全に使用できると想定しないでください。

通常、連続する物理メモリは不足しているため、必要な場合にのみ慎重に使用する必要があります。 オペレーティング システムがメモリを割り当てて解放すると、物理メモリが時間の経過と同時に断片化する可能性があるため、連続したメモリを使用する必要があるドライバーは、ドライバーの初期化中にこのメモリを割り当てる必要があります。 通常、ドライバーは、長期間使用するために内部バッファーを割り当てる DriverEntry ルーチンから MmAllocateContiguousNodeMemory を呼び出し、ドライバーがアンロードされる直前にバッファーを解放します。

MmAllocateContiguousNodeMemory によって割り当てられたメモリは、メモリが不要になったときに解放する必要があります。 MmAllocateContiguousNodeMemory によって割り当てられたメモリを解放するには、MmFreeContiguousMemory ルーチンを呼び出します。

MmAllocateContiguousNodeMemory、MmAllocateContiguousMemorySpecifyCacheNode ルーチンに似ています。 MmAllocateContiguousMemorySpecifyCacheNode とは異なり、MmAllocateContiguousNodeMemory を使用して実行なし (NX) メモリを割り当てることができます。 ベスト プラクティスとして、ドライバーが割り当てられたメモリ内で命令を実行する機能を明示的に必要とする場合を除き、ドライバーは NX メモリを割り当てる必要があります。 NX メモリを割り当てることにより、ドライバーは、悪意のあるソフトウェアがこのメモリ内の命令を実行するのを防ぐことで、セキュリティを向上させます。 MmAllocateContiguousMemoryMmAllocateContiguousMemorySpecifyCacheおよび MmAllocateContiguousMemorySpecifyCacheNode ルーチンによって割り当てられるメモリは、常に実行可能です。

BoundaryAddressMultiple パラメーターに 0 以外の値を指定した場合、割り当てられたメモリ ブロックの物理アドレス範囲は、この値の整数倍数であるアドレス境界を超えるわけではありません。 ハードウェアの制限を回避するために 0 以外の値が必要な場合を除き、ドライバーはこのパラメーターを 0 に設定する必要があります。 たとえば、デバイスが 16 メガバイトの物理境界を越えてデータを転送できない場合、ドライバーは、デバイスに表示されるアドレスが 16 メガバイトの境界でラップしないように、このパラメーターに 0x1000000 の値を指定する必要があります。

MmAllocateContiguousNodeMemory によって割り当てられるメモリは初期化されていません。 カーネル モード ドライバーは、このメモリをユーザー モード ソフトウェアに表示する場合 (特権のある可能性のあるコンテンツのリークを回避するため) 最初にゼロにする必要があります。

要件

要件
サポートされている最小のクライアント Windows 8 以降で使用できます。
対象プラットフォーム ユニバーサル
Header ntddk.h (Wdm.h、Ntddk.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

こちらもご覧ください

DriverEntry

MmAllocateContiguousMemory

MmAllocateContiguousMemorySpecifyCache

MmAllocateContiguousMemorySpecifyCacheNode

MmFreeContiguousMemory