MmAllocateContiguousNodeMemory 関数 (wdm.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 によって割り当てられたメモリは、メモリが不要になったら解放する必要があります。 MmFreeContiguousMemory ルーチンを呼び出して、MmAllocateContiguousNodeMemory によって割り当てられたメモリを解放します。

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

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

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

要件

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

こちらもご覧ください

DriverEntry

MmAllocateContiguousMemory

MmAllocateContiguousMemorySpecifyCache

MmAllocateContiguousMemorySpecifyCacheNode

MmFreeContiguousMemory