次の方法で共有


MmAllocateContiguousMemorySpecifyCache 関数 (wdm.h)

MmAllocateContiguousMemorySpecifyCache ルーチンは、連続する非ページ物理メモリの範囲を割り当て、システム アドレス空間にマップします。

構文

PVOID MmAllocateContiguousMemorySpecifyCache(
  [in]           SIZE_T              NumberOfBytes,
  [in]           PHYSICAL_ADDRESS    LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS    HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS    BoundaryAddressMultiple,
  [in]           MEMORY_CACHING_TYPE CacheType
);

パラメーター

[in] NumberOfBytes

割り当てる連続したメモリのブロックのサイズ (バイト単位)。 詳細については、「解説」を参照してください。

[in] LowestAcceptableAddress

呼び出し元が使用できる最も低い有効な物理アドレス。 たとえば、デバイスがプロセッサの物理メモリ アドレス範囲の最初の 8 メガバイトを超える場所のみをアドレス指定できる場合、このデバイスのドライバーは LowestAcceptableAddress を0x0000000000800000に設定する必要があります。

[in] HighestAcceptableAddress

呼び出し元が使用できる最も有効な物理アドレス。 たとえば、デバイスがプロセッサの物理メモリ アドレス範囲の最初の 16 メガバイトの場所のみをアドレス指定できる場合、このデバイスのドライバーは HighestAcceptableAddress を0x0000000000FFFFFFに設定する必要があります。

[in, optional] BoundaryAddressMultiple

割り当てられたバッファーが交差してはならない複数の物理アドレス。 複数の物理アドレスは、常に 2 の累乗である必要があります。 このパラメーターは省略可能であり、デバイスに特別なメモリ境界制限がないことを示す 0 として指定できます。 詳細については、「解説」を参照してください。

[in] CacheType

MEMORY_CACHING_TYPE値を指定します。これは、要求されたメモリに対して許可されるキャッシュの種類を示します。

戻り値

MmAllocateContiguousMemorySpecifyCache は 、割り当てられたメモリのベース仮想アドレスを返します。 システムが要求されたバッファーを割り当てることができない場合、ルーチンは NULL を返します。

注釈

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

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

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

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

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

大量のメモリを持つコンピューターで MmAllocateContiguousMemorySpecifyCache ルーチンを使用すると、システムが連続したメモリ チャンクを作成しようとしたときに、オペレーティング システムのパフォーマンスが著しく低下する可能性があります。 この低下は、Windows Vista SP1 および Windows Server 2008 以降では大幅に削減されますが、連続したメモリは割り当てにコストがかかる場合があります。 このため、ドライバーは MmAllocateContiguousMemorySpecifyCache の呼び出しを繰り返さないようにする必要があります。 代わりに、ドライバーは、必要なすべての連続したバッファーを DriverEntry ルーチンに割り当て、これらのバッファーを再利用する必要があります。

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

要件

要件
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

こちらもご覧ください

MmAllocateContiguousMemory

MmFreeContiguousMemory