次の方法で共有


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 が NULL場合、関数は領域を割り当てる場所を決定します。

baseAddress NULLされていない場合、指定された MEM_ADDRESS_REQUIREMENTS 構造体はすべて 0 で構成され、ベース アドレスはシステム割り当て粒度の倍数である必要があります。 割り当ての粒度を決定するには、GetSystemInfo 関数 使用します。

[in] Size

割り当てるメモリ領域のサイズ (バイト単位)。

サイズは常にページ サイズの倍数である必要があります。

BaseAddress が NULLでない場合、この関数は BaseAddress から BaseAddressSizeする範囲の 1 つ以上のバイトを含むすべてのページ 割り当てます。 これは、たとえば、ページ境界をまたぐ 2 バイト範囲によって、関数が両方のページを割り当てることを意味します。

[in] AllocationType

メモリ割り当ての種類。 このパラメーターには、次のいずれかの値が含まれている必要があります。

価値 意味
MEM_COMMIT
0x00001000
指定された予約済みメモリ ページのメモリ使用量 (メモリの全体的なサイズとディスク上のページング ファイルから) を割り当てます。 また、この関数は、呼び出し元が最初にメモリにアクセスするときに、内容がゼロになることも保証します。 仮想アドレスが実際にアクセスされるまで、実際の物理ページは割り当てされません。

ページを 1 つのステップで予約してコミットするには、MEM_COMMIT | MEM_RESERVEを使用 Virtual2AllocFromApp を呼び出します。

MEM_RESERVE なしで MEM_COMMIT を指定して特定のアドレス範囲をコミットしようとすると、以外の NULLBaseAddress は、範囲全体が既に予約されていない限り失敗します。 結果のエラー コードは ERROR_INVALID_ADDRESS

既にコミットされているページをコミットしようとしても、関数は失敗しません。 つまり、各ページの現在のコミットメント状態を最初に判断することなく、ページをコミットできます。

MEM_RESERVE
0x00002000
メモリまたはディスク上のページング ファイル内の実際の物理ストレージを割り当てずに、プロセスの仮想アドレス空間の範囲を予約します。

予約済みページは、Virtual2AllocFromApp 関数の後続の呼び出しでコミットできます。 ページを 1 つのステップで予約してコミットするには、MEM_COMMIT | MEM_RESERVEVirtual2AllocFromApp を呼び出します。

malloc や localAllocなど、他のメモリ割り当て関数では、解放されるまで予約されたメモリ範囲を使用できません。

MEM_REPLACE_PLACEHOLDER
0x00004000
プレースホルダーを通常のプライベート割り当てに置き換えます。 サポートされているのは、データ/pf に基づくセクション ビューのみです (イメージや物理メモリなどはサポートされません)。 プレースホルダーを置き換える場合、BaseAddress と Size はプレースホルダーのものと完全に一致する必要があり、指定された MEM_ADDRESS_REQUIREMENTS 構造体はすべてゼロで構成されている必要があります。

プレースホルダーをプライベート割り当てに置き換えた後、その割り当てをプレースホルダーに解放するには、VirtualFree と VirtualFreeExの dwFreeType パラメーター 参照してください。

プレースホルダーは、予約済みメモリ領域の一種です。

MEM_RESERVE_PLACEHOLDER
0x00040000
プレースホルダーを作成するには、MEM_RESERVE | MEM_RESERVE_PLACEHOLDERVirtualAlloc2 を呼び出し、PageProtectionPAGE_NOACCESSに設定します。 プレースホルダーを解放/分割/結合するには、VirtualFree と VirtualFreeExの dwFreeType パラメーター 参照してください。

プレースホルダーは、予約済みメモリ領域の一種です。

MEM_RESET
0x00080000
BaseAddress と Size で指定されたメモリ範囲内のデータが関心を持たなくなったことを示します。 ページをページング ファイルから読み取ったり、ページング ファイルに書き込んだりしないでください。 ただし、メモリ ブロックは後で再度使用されるため、デコミットしないでください。 この値は、他の値と共に使用することはできません。

この値を使用しても、MEM_RESET で操作される範囲にゼロが含まれるという保証はありません。 範囲にゼロを含める場合は、メモリをデコミットしてから、再コミットします。

MEM_RESETを指定すると、Virtual2AllocFromApp 関数は Protectionの値を無視します。 ただし、引き続き 保護 を有効な保護値 (PAGE_NOACCESSなど) に設定する必要があります。

Virtual2AllocFromApp は、MEM_RESET を使用し、メモリの範囲がファイルにマップされている場合にエラーを返します。 共有ビューは、ページング ファイルにマップされている場合にのみ使用できます。

MEM_RESET_UNDO
0x1000000
MEM_RESET_UNDO は、MEM_RESET が以前に正常に適用されたアドレス範囲でのみ呼び出す必要があります。 これは、BaseAddress と Size で指定された指定されたメモリ範囲内のデータが呼び出し元にとって重要であり、MEM_RESETの効果を元に戻そうとしていることを示します。 関数が成功した場合は、指定したアドレス範囲のすべてのデータはそのままであることを意味します。 関数が失敗した場合、アドレス範囲のデータの少なくとも一部がゼロに置き換えられました。

この値は、他の値と共に使用することはできません。 前に MEM_RESET されなかったアドレス範囲で MEM_RESET_UNDO が呼び出された場合、動作は未定義です。 MEM_RESETを指定すると、Virtual2AllocFromApp 関数は Protectionの値を無視します。 ただし、引き続き 保護 を有効な保護値 (PAGE_NOACCESSなど) に設定する必要があります。

 

このパラメーターでは、次の値を指定することもできます。

価値 意味
MEM_LARGE_PAGES
0x20000000
大きなページ サポート使用してメモリを割り当てます。

サイズと配置は、大きなページの最小値の倍数である必要があります。 この値を取得するには、GetLargePageMinimum 関数を使用します。

この値を指定する場合は、MEM_RESERVEMEM_COMMITも指定する必要があります。

MEM_PHYSICAL
0x00400000
アドレスウィンドウ拡張 (AWE) ページ マップするために使用できるアドレス範囲を予約します。

この値は、MEM_RESERVE で使用する必要があり、他の値は使用できません。

MEM_TOP_DOWN
0x00100000
可能な限り高いアドレスでメモリを割り当てます。 これは、特に割り当てが多い場合に、通常の割り当てよりも遅くなる可能性があります。
MEM_WRITE_WATCH
0x00200000
割り当てられたリージョンに書き込まれたページをシステムが追跡します。 この値を指定する場合は、MEM_RESERVEも指定する必要があります。

リージョンが割り当てられたか、書き込み追跡状態がリセットされた後に書き込まれたページのアドレスを取得するには、getWriteWatch 関数 呼び出します。 書き込み追跡状態をリセットするには、GetWriteWatch 呼び出すか、ResetWriteWatchします。 書き込み追跡機能は、領域が解放されるまでメモリ領域に対して有効なままです。

[in] PageProtection

割り当てるページの領域のメモリ保護。 ページをコミットする場合は、メモリ保護定数のいずれかを指定できます。 次の定数を指定すると、エラーが発生します。

  • PAGE_EXECUTE
  • PAGE_EXECUTE_READ
  • PAGE_EXECUTE_READWRITE
  • PAGE_EXECUTE_WRITECOPY

[in, out, optional] ExtendedParameters

MEM_EXTENDED_PARAMETER型の 1 つ以上の拡張パラメーターへの省略可能なポインター。 これらの各拡張パラメーター値には、MemExtendedParameterAddressRequirements または MemExtendedParameterNumaNodeType フィールドを持つことができます。 拡張パラメーター MemExtendedParameterNumaNode が指定されていない場合、動作は、VirtualAllocMapViewOfFile 関数と同じです (つまり、物理ページの優先 NUMA ノードは、最初にメモリにアクセスするスレッドの理想的なプロセッサに基づいて決定されます)。

[in] ParameterCount

ExtendedParametersによって指される拡張パラメーターの数。

戻り値

関数が成功した場合、戻り値はページの割り当てられた領域のベース アドレスです。

関数が失敗した場合、戻り値は NULL。 拡張エラー情報を取得するには、GetLastError呼び出します。

備考

この API は、仮想アドレス空間の管理に関する特定の要件を持つ、高パフォーマンスのゲームとサーバー アプリケーションをサポートするのに役立ちます。 たとえば、以前に予約されたリージョンの上にメモリをマッピングする場合などです。これは、リング バッファーを自動的にラップする実装に役立ちます。 そして、特定のアライメントでメモリを割り当てる。たとえば、アプリケーションが大規模/巨大なページ マップ領域をオンデマンドでコミットできるようにします。

Just-In-Time (JIT) 機能 Windows ストア アプリから Virtual2AllocFromApp を呼び出して、JIT 機能を使用できます。 JIT 機能を使用するには、アプリ マニフェスト ファイルに codeGeneration 機能を含める必要があります。

各ページには、ページの状態関連付けられています。 Virtual2AllocFromApp 関数は、次の操作を実行できます。

  • 予約ページのリージョンをコミットする
  • 無料ページのリージョンを予約する
  • 空きページの領域を同時に予約してコミットする
Virtual2AllocFromApp は予約ページを予約できません。 既にコミットされているページをコミットできます。 つまり、既にコミットされているかどうかに関係なく、ページの範囲をコミットでき、関数は失敗しません。

Virtual2AllocFromApp を使用してページのブロックを予約し、Virtual2AllocFromApp 追加の呼び出しを行って、予約ブロックから個々のページをコミットできます。 これにより、プロセスは、必要になるまで物理ストレージを消費することなく、その仮想アドレス空間の範囲を予約できます。

BaseAddress パラメーターが NULLでない場合、関数は BaseAddress パラメーターと Size パラメーターを使用して、割り当てるページの領域を計算します。 ページの範囲全体の現在の状態は、AllocationType パラメーターで指定された割り当ての種類と互換性がある必要があります。 それ以外の場合、関数は失敗し、どのページも割り当てされません。 この互換性要件では、前に説明したように、既にコミット済みのページのコミットは除外されません。

Virtual2AllocFromApp では、実行可能ページの作成は許可されません。

Virtual2AllocFromApp 関数を使用すると、指定されたプロセスの仮想アドレス空間内のメモリの アドレス ウィンドウ拡張 (AWE) 領域を予約できます。 その後、このメモリ領域を使用して、アプリケーションの必要に応じて、仮想メモリとの間で物理ページをマップできます。 MEM_PHYSICALMEM_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 の

VirtualFree

VirtualLock

VirtualProtectFromApp

VirtualQuery の