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 によって割り当てられたメモリは、メモリが不要になったときに解放する必要があります。 mmFreeContiguousMemory ルーチンを呼び出して、mmAllocateContiguousMemorySpecifyCache によって割り当てられたメモリ解放します。
BoundaryAddressMultiple パラメーターに 0 以外の値を指定した場合、割り当てられたメモリ ブロックの物理アドレス範囲は、この値の整数倍数であるアドレス境界を超えるわけではありません。 ハードウェアの制限を回避するために 0 以外の値が必要な場合を除き、ドライバーは、このパラメーターを 0 に設定する必要があります。 たとえば、デバイスが 16 メガバイトの物理境界を越えてデータを転送できない場合、ドライバーは、デバイスに表示されるアドレスが 16 MB の境界で折り返されないように、このパラメーターの0x1000000の値を指定する必要があります。
大量のメモリを持つコンピューターで MmAllocateContiguousMemorySpecifyCache ルーチンを使用すると、システムが連続したメモリ チャンクを作成しようとしたときに、オペレーティング システムのパフォーマンスが大幅に低下する可能性があります。 この低下は、Windows Vista SP1 および Windows Server 2008 以降では大幅に削減されますが、連続したメモリは割り当てにコストがかかる場合があります。 このため、ドライバーは、mmAllocateContiguousMemorySpecifyCache 繰り返し呼び出しを回避する必要があります。 代わりに、ドライバーは、DriverEntry ルーチンに必要なすべての連続したバッファーを割り当て、これらのバッファーを再利用する必要があります。
割り当てる mmAllocateContiguousMemorySpecifyCache メモリは初期化されていません。 カーネル モード ドライバーは、ユーザー モード のソフトウェアに表示する場合は、このメモリを最初にゼロにする必要があります (潜在的に特権のあるコンテンツのリークを回避するため)。
必要条件
要件 | 価値 |
---|---|
ターゲット プラットフォーム の | 万国 |
ヘッダー | wdm.h (Wdm.h、Ntddk.h を含む) |
ライブラリ | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
関連項目
mmAllocateContiguousMemory の