仮想アドレス空間

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
仮想アドレス空間と物理アドレス空間のrelationship.svg

コンピューティングでは、仮想アドレス空間VAS)またはアドレス空間は、オペレーティングシステムがプロセスで利用できるようにする仮想アドレスの範囲のセットです。[1]仮想アドレスの範囲は通常、低いアドレスから始まり、コンピューターの命令セットアーキテクチャで許可され、オペレーティングシステムのポインターサイズの実装でサポートされる最も高いアドレスまで拡張できます。32ビットまたは64ビットOSバージョンの場合は8バイト。これにはいくつかの利点があり、そのうちの1つは各プロセスに個別のアドレス空間が与えられていると仮定した場合のプロセスの分離

以下の説明では、使用される用語はWindows NTオペレーティングシステムに固有のものですが、概念は他の仮想メモリオペレーティングシステムにも適用できます。

32ビットOSで新しいアプリケーションが実行されると、プロセスには4 GiB VASがあります。そのスペースの各メモリアドレス(0〜2 32 − 1)は、値として1バイトを持つことができます。最初は、それらのいずれにも値がありません(「-」は値がないことを表します)。このようなVASで値を使用または設定すると、メモリ例外が発生します。

           0 4 GiB
VAS | ---------------------------------------------- |

次に、アプリケーションの実行可能ファイルがVASにマップされます。プロセスVASのアドレスは、exeファイルのバイトにマップされます。OSはマッピングを管理します。

           0 4 GiB
VAS | --- vvv ---------------------------------------- |
マッピング|||
ファイルバイトアプリ

vは、マップされたファイルのバイトからの値です次に、必要なDLLファイルがマップされます(これには、カスタムライブラリとkernel32.dllおよびなどのシステムライブラリが含まれますuser32.dll)。

           0 4 GiB
VAS | --- vvv -------- vvvvvv --- vvvv ------------------- |
マッピング||| |||||| ||||
ファイルバイトアプリカーネルユーザー

次に、プロセスはexeファイルのバイトの実行を開始します。ただし、プロセスがVASで「-」値を使用または設定できる唯一の方法は、ファイルからバイトにマップするようにOSに要求することです。この方法でVASメモリを使用する一般的な方法は、VASメモリをページファイルにマップすることです。ページファイルは単一のファイルですが、連続するバイトの複数の異なるセットをVASにマップできます。

           0 4 GiB
VAS | --- vvv -------- vvvvvv --- vvvv ---- vv --- v ---- vvv-- |
マッピング||| |||||| |||| || | |||
ファイルバイトアプリカーネルユーザーsystem_page_file

また、ページファイルのさまざまな部分をさまざまなプロセスのVASにマッピングできます。

           0 4 GiB
VAS 1 | --- vvvv ------- vvvvvv --- vvvv ---- vv --- v ---- vvv-- |
マッピング|||| |||||| |||| || | |||
ファイルバイトapp1app2カーネルユーザーsystem_page_file
マッピング|||| |||||| |||| || |
VAS 2 | -------- vvvv--vvvvvv --- vvvv ------- vv --- v ------ |

Microsoft Windows 32ビットでは、デフォルトでは、2GiBのみがプロセスで使用できるようになっています。[2]他の2つのGiBはオペレーティングシステムによって使用されます。それ以降の32ビット版のMicrosoftWindowsでは、プログラムをIMAGE_FILE_LARGE_ADDRESS_AWAREとしてマークし、/ 3GBスイッチを有効にすることで、ユーザーモードの仮想アドレス空間を3 GiB拡張できますが、カーネルモードの仮想アドレス空間には1GiBしか残されていません。 boot.iniファイル。[3] [4]

Microsoft Windows 64ビットでは、/ LARGEADDRESSAWARE:NOにリンクされた実行可能ファイルを実行しているプロセスで、オペレーティングシステムがプロセスの仮想アドレス空間のユーザーモード部分を人為的に2GiBに制限します。これは、32ビットと64ビットの両方の実行可能ファイルに適用されます。[5] [6] / LARGEADDRESSAWARE:YESオプション(64ビットVisual Studio 2010以降のデフォルト)でリンクされた実行可能ファイルを実行しているプロセスは、[7] 2GiBを超える仮想アドレス空間にアクセスできます。 32ビット実行可能ファイルの場合は最大4GiB 、Windows8からWindows8までの64ビット実行可能ファイルの場合は最大8TiB 、Windows8.1以降の64ビット実行可能ファイルの場合は最大128TiB[4][8]

Cmallocを介してメモリを割り当てると、ページファイルが新しい仮想アドレス空間のバッキングストアとして確立されます。ただし、プロセスはファイルバイト を明示的にマップすることもできます。

Linux

x86 CPUの場合、Linux 32ビットでは、ユーザーとカーネルのアドレス範囲をさまざまな方法で分割できます。3G/ 1Gユーザー/カーネル(デフォルト)、1G/3Gユーザー/カーネルまたは2G/2Gユーザー/カーネル[9]

も参照してください

メモ

  1. ^ IBMCorporation。「アドレス空間とは何ですか?」2013年8月24日取得
  2. ^ 「仮想アドレス空間」MSDNマイクロソフト。
  3. ^ 「LOADED_IMAGE構造」MSDNマイクロソフト。
  4. ^ a b "4ギガバイトチューニング:BCDEditおよびBoot.ini"MSDNマイクロソフト。
  5. ^ "/ LARGEADDRESSAWARE(大きなアドレスを処理する)"MSDNマイクロソフト。
  6. ^ 「仮想アドレス空間」MSDNマイクロソフト。
  7. ^ "/ LARGEADDRESSAWARE(大きなアドレスを処理する)"MSDNマイクロソフト。
  8. ^ "/ LARGEADDRESSAWARE(大きなアドレスを処理する)"MSDNマイクロソフト。
  9. ^ 「Linuxカーネル-x86:メモリ分割」

参照