
コンピューティングにおいて、仮想アドレス空間( VAS ) またはアドレス空間は、オペレーティングシステムがプロセスに提供する仮想アドレスの範囲の集合です。 [1]仮想アドレスの範囲は通常、低いアドレスから始まり、コンピュータの命令セットアーキテクチャで許可され、オペレーティングシステムのポインターサイズの実装でサポートされている最大アドレスまで拡張できます。これは、 32 ビットOS バージョンの場合は4バイト、 64 ビットOS バージョンの場合は8バイトです。これにより、プロセスごとに個別のアドレス空間が割り当てられていると仮定して、プロセスを分離することでセキュリティを確保できるなど、いくつかの利点があります。
例
- 以下の説明では、 Windows NTオペレーティング システムに特有の用語が使用されますが、概念は他の仮想メモリオペレーティング システムにも適用できます。
32 ビットOS上で新しいアプリケーションが実行されると、プロセスには4 GiB のVAS が存在します。その空間内の各メモリ アドレス(0 から 2 32 − 1) には、1 バイトの値を設定できます。最初は、いずれにも値がありません (「-」は値なしを表します)。このような VAS で値を使用したり設定したりすると、メモリ例外が発生します。
0 4 ギバ VAS |----------------------------------------------|
次に、アプリケーションの実行可能ファイルが VAS にマッピングされます。プロセス VAS 内のアドレスは、exe ファイル内のバイトにマッピングされます。OS はマッピングを管理します。
0 4 ギバ VAS |---vvv----------------------------------------| マッピング ||| ファイルバイトアプリ
v は、マップされたファイル内のバイトの値です。次に、必要なDLLファイルがマップされます (これには、カスタム ライブラリと、 や などのシステム ライブラリが含まれますkernel32.dll) user32.dll。
0 4 ギバ VAS |---vvv--------vvvvvv---vvvv--------| マッピング ||| |||||| |||| ファイル バイト アプリ カーネル ユーザー
次に、プロセスは EXE ファイル内のバイトの実行を開始します。ただし、プロセスが VAS で '-' 値を使用または設定できる唯一の方法は、OS にファイルのバイトにマップするように要求することです。このように VAS メモリを使用する一般的な方法は、ページ ファイルにマップすることです。ページ ファイルは単一のファイルですが、連続するバイトの複数の異なるセットを VAS にマップできます。
0 4 ギバ VAS |---vvv--------vvvvvv---vvvv----vv---v----vvv--| マッピング ||| |||||| |||| || | ||| ファイル バイト アプリ カーネル ユーザー system_page_file
また、ページ ファイルのさまざまな部分をさまざまなプロセスの VAS にマップできます。
0 4 ギバ VAS 1 |---vvvv--------vvvvvv---vvvv----vv---v----vvv--| マッピング |||| |||||| |||| ||| | ||| ファイル バイト app1 app2 カーネル ユーザー system_page_file マッピング |||| |||||| |||| || | VAS 2 |----------vvvv--vvvvvv---vvvv----------vv---v------|
Microsoft Windows 32 ビット版では、デフォルトでは、プロセスが独自に使用できるのは2 GiBのみです。 [2]残りの2 GiBはオペレーティング システムによって使用されます。Microsoft Windows のそれ以降の 32 ビット版では、プログラムを IMAGE_FILE_LARGE_ADDRESS_AWARE としてマークし、boot.ini ファイルでスイッチを有効にすることで、ユーザー モードの仮想アドレス空間を3 GiBに拡張し、カーネル モードの仮想アドレス空間に1 GiBのみを残すことができます。 [3] [4]/3GB
Microsoft Windows 64 ビットでは、 でリンクされた実行可能ファイルを実行するプロセスでは/LARGEADDRESSAWARE:NO、オペレーティング システムがプロセスの仮想アドレス空間のユーザー モード部分を人為的に 2 GiB に制限します。これは、32 ビットと 64 ビットの両方の実行可能ファイルに適用されます。[5] [6]/LARGEADDRESSAWARE:YES 64 ビット Visual Studio 2010 以降の既定値である でリンクされた実行可能ファイルを実行するプロセスは、 [7] 2 GiBを超える仮想アドレス空間にアクセスできます。32 ビット実行可能ファイルの場合は最大4 GiB 、 Windows から Windows 8 までの 64 ビット実行可能ファイルの場合は最大8 TiB 、 Windows 8.1 以降の 64 ビット実行可能ファイルの場合は最大128 TiBです。 [4] [8]
Cのmalloc を介してメモリを割り当てると、ページ ファイルが新しい仮想アドレス空間のバッキング ストアとして確立されます。ただし、プロセスはファイル バイトを 明示的にマップすることもできます。
リナックス
x86 CPUの場合、 Linux 32ビットでは、ユーザーとカーネルのアドレス範囲を3G/1Gユーザー/カーネル(デフォルト)、1G/3Gユーザー/カーネル、または2G/2Gユーザー/カーネルのさまざまな方法で分割できます。[9]
参照
注記
- ^ 「アドレス空間とは何か?」IBM . 2024年5月5日閲覧。
- ^ 「仮想アドレス空間」。MSDN。Microsoft。
- ^ 「LOADED_IMAGE 構造」。MSDN。Microsoft。
- ^ ab 「4 ギガバイトのチューニング: BCDEdit と Boot.ini」。MSDN。マイクロソフト。
- ^ 「/LARGEADDRESSAWARE (大きなアドレスの処理)」。MSDN。Microsoft。
- ^ 「仮想アドレス空間」。MSDN。Microsoft。
- ^ 「/LARGEADDRESSAWARE (大きなアドレスの処理)」。MSDN。Microsoft。
- ^ 「/LARGEADDRESSAWARE (大きなアドレスの処理)」。MSDN。Microsoft。
- ^ 「Linux カーネル - x86: メモリ分割」。
参考文献
- 「Advanced Windows」ジェフリー・リクター著、マイクロソフト・プレス
