MmAllocatePagesForMdl 関数 (wdm.h)
MmAllocatePagesForMdl ルーチンは、ページなしの 0 個の物理メモリ ページを MDL に割り当てます。
構文
PMDL MmAllocatePagesForMdl(
[in] PHYSICAL_ADDRESS LowAddress,
[in] PHYSICAL_ADDRESS HighAddress,
[in] PHYSICAL_ADDRESS SkipBytes,
[in] SIZE_T TotalBytes
);
パラメーター
[in] LowAddress
割り当てられたページを取得できる最初のアドレス範囲の先頭の物理アドレスを指定します。 MmAllocatePagesForMdl が最初のアドレス範囲に要求されたバイト数を割り当てることができない場合は、追加のアドレス範囲を反復処理してより多くのページを取得します。 各イテレーションで、 MmAllocatePagesForMdl は SkipBytes の値を前の開始アドレスに追加して、次のアドレス範囲の開始を取得します。
[in] HighAddress
割り当てられたページの最初のアドレス範囲の末尾の物理アドレスを指定します。
[in] SkipBytes
割り当てられたページを取得できる前のアドレス範囲の先頭からスキップするバイト数を指定します。 SkipBytes は、仮想メモリ ページ サイズの整数倍数 (バイト単位) である必要があります。
[in] TotalBytes
MDL に割り当てる合計バイト数を指定します。
戻り値
MmAllocatePagesForMdl は、次のいずれかを返します。
リターン コード | 説明 |
---|---|
MDL ポインター | MDL ポインターは、指定されたアドレス範囲内の物理ページのセットを記述します。 要求されたバイト数が使用できない場合、MDL は使用可能な量の物理メモリを記述します。 |
NULL | 指定されたアドレス範囲に物理メモリ ページがないか、MDL 自体に十分なメモリ プールがありません。 |
注釈
Windows Server 2003 Service Pack 1 (SP1) 以降のバージョンの Windows で実行されているドライバーでは、MmAllocatePagesForMdl ではなく MmAllocatePagesForMdlEx ルーチンを使用する必要があります。 MmAllocatePagesForMdlEx は、変換ルックアサイド バッファー (TLB) とキャッシュ メモリの不要なフラッシュを回避することで、 MmAllocatePagesForMdl よりも優れたパフォーマンスを提供します。
MmAllocatePagesForMdl によって返される物理メモリ ページは、通常、連続したページではありません。 MmAllocatePagesForMdl は、返された MDL 内の割り当てられたページに常にゼロを入力します。
MmAllocatePagesForMdl は、対応する仮想アドレスを必要としないカーネル モード ドライバー (つまり、物理ページを必要とせず、ページを物理的に連続させる必要はありません) または、デバイスの物理メモリが特定の物理アドレス範囲に割り当てられている場合に大幅なパフォーマンス向上を実現できるカーネル モード ドライバーによって使用されるように設計されています。 AGP グラフィックス カードのドライバーは、このようなドライバーの例です。
要求された範囲で現在使用できる物理メモリの量によっては、 MmAllocatePagesForMdl は、要求されたメモリよりも少ないメモリを記述する MDL を返す場合があります。 メモリが割り当てられていない場合、ルーチンは NULL を 返します。 呼び出し元は、MDL に実際に割り当てられているメモリの量をチェックする必要があります。
呼び出し元は MmFreePagesFromMdl を 使用して、 MmAllocatePagesForMdl によって作成された MDL によって記述されたメモリ ページを解放する必要があります。 MmFreePagesFromMdl を呼び出した後、呼び出し元は ExFreePool を呼び出して、MDL 構造体自体に割り当てられているメモリを解放する必要もあります。
Windows 2000 以降のバージョンの Windows では、 MmAllocatePagesForMdl が 1 回の呼び出しで割り当てることができるメモリの最大量は (4 ギガバイト - PAGE_SIZE) です。 ルーチンは、十分なページが使用可能な場合にのみ、この量の割り当て要求を満たすことができます。
MmAllocatePagesForMdl は IRQL <= APC_LEVELで実行されます。 Windows Server 2008 以降のバージョンの Windows オペレーティング システムでは、 mmAllocatePagesForMdl 呼び出し元がDISPATCH_LEVELで呼び出すことができます。 ただし、APC_LEVEL 以下で を呼び出すことで、ドライバーのパフォーマンスを向上させることができます。
特殊なカーネル非同期プロシージャ 呼び出し (APC) から MmAllocatePagesForMdl を呼び出すと、排他的ロックが再帰的に取得される可能性があります。これは、重要なリージョン (ユーザーまたは通常のカーネル APC が無効) 内にのみ存在しますが、保護されたリージョン (すべての APCs が無効) には含まれません。
要件
要件 | 値 |
---|---|
対象プラットフォーム | ユニバーサル |
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | 「解説」を参照してください。 |
DDI コンプライアンス規則 | HwStorPortProhibitedDDIs(storport)、 IrqlMmApcLte(wdm)、 SpNoWait(storport)、 StorPortStartIo(storport) |