VirtualAlloc2FromApp 関数 (memoryapi.h)
呼び出し元プロセスの仮想アドレス空間内のページ領域の状態を予約、コミット、または変更します。 この関数によって割り当てられたメモリは、自動的に 0 に初期化されます。
この関数を使用すると、新しい割り当てに対して、仮想アドレス空間の範囲と 2 乗アライメント制限を指定できます。任意の数の拡張パラメーターを指定します。物理メモリの優先 NUMA ノードを拡張パラメーターとして指定します。プレースホルダー操作 (具体的には置換) を指定します。
NUMA ノードを指定するには、ExtendedParameters パラメーターを参照してください。
構文
PVOID VirtualAlloc2FromApp(
[in, optional] HANDLE Process,
[in, optional] PVOID BaseAddress,
[in] SIZE_T Size,
[in] ULONG AllocationType,
[in] ULONG PageProtection,
[in, out, optional] MEM_EXTENDED_PARAMETER *ExtendedParameters,
[in] ULONG ParameterCount
);
パラメーター
[in, optional] Process
プロセスへのハンドル。 この関数は、このプロセスの仮想アドレス空間内にメモリを割り当てます。
ハンドルには、PROCESS_VM_OPERATION アクセス権が必要です。 詳細については、「プロセス セキュリティとアクセス権の
[in, optional] BaseAddress
割り当てるページの領域に必要な開始アドレスを指定するポインター。
BaseAddress
baseAddress
[in] Size
割り当てるメモリ領域のサイズ (バイト単位)。
サイズは常にページ サイズの倍数である必要があります。
BaseAddress
[in] AllocationType
メモリ割り当ての種類。 このパラメーターには、次のいずれかの値が含まれている必要があります。
価値 | 意味 |
---|---|
|
指定された予約済みメモリ ページのメモリ使用量 (メモリの全体的なサイズとディスク上のページング ファイルから) を割り当てます。 また、この関数は、呼び出し元が最初にメモリにアクセスするときに、内容がゼロになることも保証します。 仮想アドレスが実際にアクセスされるまで、実際の物理ページは割り当てされません。
ページを 1 つのステップで予約してコミットするには、 MEM_RESERVE なしで MEM_COMMIT を指定して特定のアドレス範囲をコミットしようとすると、以外の NULLBaseAddress は、範囲全体が既に予約されていない限り失敗します。 結果のエラー コードは ERROR_INVALID_ADDRESS。 既にコミットされているページをコミットしようとしても、関数は失敗しません。 つまり、各ページの現在のコミットメント状態を最初に判断することなく、ページをコミットできます。 |
|
メモリまたはディスク上のページング ファイル内の実際の物理ストレージを割り当てずに、プロセスの仮想アドレス空間の範囲を予約します。
予約済みページは、Virtual2AllocFromApp 関数の後続の呼び出しでコミットできます。 ページを 1 つのステップで予約してコミットするには、MEM_COMMIT | MEM_RESERVEVirtual2AllocFromApp を呼び出します。 |
|
プレースホルダーを通常のプライベート割り当てに置き換えます。 サポートされているのは、データ/pf に基づくセクション ビューのみです (イメージや物理メモリなどはサポートされません)。 プレースホルダーを置き換える場合、BaseAddress と プレースホルダーをプライベート割り当てに置き換えた後、その割り当てをプレースホルダーに解放するには、VirtualFree プレースホルダーは、予約済みメモリ領域の一種です。 |
|
プレースホルダーを作成するには、MEM_RESERVE | MEM_RESERVE_PLACEHOLDER VirtualAlloc2 を呼び出し、PageProtectionPAGE_NOACCESSに設定します。 プレースホルダーを解放/分割/結合するには、VirtualFree と VirtualFreeExの プレースホルダーは、予約済みメモリ領域の一種です。 |
|
BaseAddress と この値を使用しても、MEM_RESET で操作される範囲にゼロが含まれるという保証はありません。 範囲にゼロを含める場合は、メモリをデコミットしてから、再コミットします。 MEM_RESETを指定すると、Virtual2AllocFromApp 関数は Protectionの値を無視します。 ただし、引き続き 保護 を有効な保護値 (PAGE_NOACCESSなど) に設定する必要があります。 Virtual2AllocFromApp は、MEM_RESET を使用し、メモリの範囲がファイルにマップされている場合にエラーを返します。 共有ビューは、ページング ファイルにマップされている場合にのみ使用できます。 |
|
MEM_RESET_UNDO は、MEM_RESET が以前に正常に適用されたアドレス範囲でのみ呼び出す必要があります。 これは、BaseAddress と この値は、他の値と共に使用することはできません。 前に MEM_RESET されなかったアドレス範囲で MEM_RESET_UNDO が呼び出された場合、動作は未定義です。 MEM_RESETを指定すると、Virtual2AllocFromApp 関数は Protectionの値を無視します。 ただし、引き続き 保護 を有効な保護値 (PAGE_NOACCESSなど) に設定する必要があります。 |
このパラメーターでは、次の値を指定することもできます。
価値 | 意味 |
---|---|
|
大きなページ サポート サイズと配置は、大きなページの最小値の倍数である必要があります。 この値を取得するには、GetLargePageMinimum 関数を使用します。 この値を指定する場合は、MEM_RESERVE と MEM_COMMITも指定する必要があります。 |
|
アドレスウィンドウ拡張 (AWE) ページ この値は、MEM_RESERVE で使用する必要があり、他の値は使用できません。 |
|
可能な限り高いアドレスでメモリを割り当てます。 これは、特に割り当てが多い場合に、通常の割り当てよりも遅くなる可能性があります。 |
|
割り当てられたリージョンに書き込まれたページをシステムが追跡します。 この値を指定する場合は、MEM_RESERVEも指定する必要があります。
リージョンが割り当てられたか、書き込み追跡状態がリセットされた後に書き込まれたページのアドレスを取得するには、getWriteWatch 関数 |
[in] PageProtection
割り当てるページの領域のメモリ保護。 ページをコミットする場合は、メモリ保護定数のいずれかを指定できます。 次の定数を指定すると、エラーが発生します。
- PAGE_EXECUTE
- PAGE_EXECUTE_READ
- PAGE_EXECUTE_READWRITE
- PAGE_EXECUTE_WRITECOPY
[in, out, optional] ExtendedParameters
MEM_EXTENDED_PARAMETER型の 1 つ以上の拡張パラメーターへの省略可能なポインター。 これらの各拡張パラメーター値には、MemExtendedParameterAddressRequirements または MemExtendedParameterNumaNodeの Type フィールドを持つことができます。 拡張パラメーター
[in] ParameterCount
ExtendedParametersによって指される拡張パラメーターの数。
戻り値
関数が成功した場合、戻り値はページの割り当てられた領域のベース アドレスです。
関数が失敗した場合、戻り値は NULL
備考
この API は、仮想アドレス空間の管理に関する特定の要件を持つ、高パフォーマンスのゲームとサーバー アプリケーションをサポートするのに役立ちます。 たとえば、以前に予約されたリージョンの上にメモリをマッピングする場合などです。これは、リング バッファーを自動的にラップする実装に役立ちます。 そして、特定のアライメントでメモリを割り当てる。たとえば、アプリケーションが大規模/巨大なページ マップ領域をオンデマンドでコミットできるようにします。
Just-In-Time (JIT) 機能 Windows ストア アプリから Virtual2AllocFromApp を呼び出して、JIT 機能を使用できます。 JIT 機能を使用するには、アプリ マニフェスト ファイルに codeGeneration 機能を含める必要があります。
各ページには、ページの状態
- 予約ページのリージョンをコミットする
- 無料ページのリージョンを予約する
- 空きページの領域を同時に予約してコミットする
Virtual2AllocFromApp では、実行可能ページの作成は許可されません。
Virtual2AllocFromApp 関数を使用すると、指定されたプロセスの仮想アドレス空間内のメモリの アドレス ウィンドウ拡張 (AWE) 領域を予約できます。 その後、このメモリ領域を使用して、アプリケーションの必要に応じて、仮想メモリとの間で物理ページをマップできます。 MEM_PHYSICAL と MEM_RESERVE の値は、AllocationType パラメーターで設定する必要があります。 MEM_COMMIT 値は設定しないでください。 ページ保護を PAGE_READWRITEに設定する必要があります。
VirtualFree 関数は、コミットされたページのコミットを解除したり、ページのストレージを解放したり、コミットされたページを同時にデコミットして解放したりできます。 また、予約ページを解放して、無料のページにすることもできます。
実行可能なリージョンを作成する場合、呼び出し元のプログラムは、コードが設定されたら、FlushInstructionCache への適切な呼び出しによってキャッシュの一貫性を確保する責任を負います。 そうしないと、新しく実行可能なリージョンからコードを実行しようとすると、予期しない結果が発生する可能性があります。
例
コード例については、Virtual2Alloc
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 10 [デスクトップ アプリのみ] |
サポートされる最小サーバー | Windows Server 2016 [デスクトップ アプリのみ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | memoryapi.h (Windows.h を含む) |
ライブラリ | WindowsApp.lib |
DLL | Kernel32.dll |
関連項目
仮想メモリ関数 の
VirtualAlloc の
VirtualAllocEx の
VirtualQuery の