64 ビット Windows OS で利用可能なユーザー仮想アドレス空間は 8 テラバイトであることがわかりました。しかし、これで実行しているプログラムが 32 ビット互換モードで実行されている場合、これほど多くのユーザー空間がまだ利用可能でしょうか? それとも、通常の 32 ビット OS のように動作し、2GB のユーザー アドレス空間しか与えませんか?
6 に答える
Microsoft には、さまざまな制限を示すグラフがあります。Windows リリースのメモリ制限
ユーザー モードの仮想アドレス空間だけを要約すると、次のようになります。
- 32 ビット Windows:
- 32 ビット プロセス: デフォルトで 2 GB。3 GB
/LARGEADDRESSAWARE:YES
と 4GT
- 32 ビット プロセス: デフォルトで 2 GB。3 GB
- 64 ビット Windows (x64 アーキテクチャ):
- 32 ビット プロセス: デフォルトで 2 GB。4 GB
/LARGEADDRESSAWARE:YES
- 64 ビット プロセス: デフォルトで 8 TB。2 GB
/LARGEADDRESSAWARE:NO
- 32 ビット プロセス: デフォルトで 2 GB。4 GB
4GT は 4 ギガバイトのチューニングです。
- XP:
/3GB
boot.ini スイッチ - ビスタ:
bcdedit /set increaseuserva 3072
Mark Russinovich は、これらの制限の多くを説明するブログ投稿を作成しました: Pushing the Limiting of Windows: Virtual Memory
64ビットマシン/OSを使用してIIS6.0+で32ビットプロセスを実行すると、プロセスは最大4GBのメモリをアドレス指定できることに注意してください。
プログラムが Wow64 サブシステムで 32 ビット プロセスとして実行されている場合、実際の 32 ビット OS で表示されるのとまったく同じアドレス空間が表示されます。特別なオプションがなければ、32 ビット プロセスは 2GB のメモリを使用できます。
唯一の違いは、LargeAddressAwareオプションを使用した場合の使用可能なメモリです。通常の 32 ビット プロセスでは、これにより 3GB のアドレス可能なメモリが可能になります。Wow64 プロセスでは、最大 4GB を認識できます ( Source )
私の最初の答えはかなり悪かった。これは、JaredPar がよく言っていることを説明するリンクです。
ハードウェアに関する限り、互換モードで実行している場合 (つまり、IA32_EFER.LMA が設定され、CS のセグメント記述子で L ビットがクリアされている場合)、セグメントは 32 ビット セグメントのように動作します。あれは:
- セグメント ベースは 32 ビットに制限されています。
- セグメント制限も 32 ビットに制限されています (G ビットを使用)。
これにより、実質的に 4 GB の仮想アドレスに制限されます。OSがさまざまなモードで仮想メモリをどのように分割するかについてはよくわかりませんが、これはハードウェアの制限です。(申し訳ありません...私はハードウェアの専門家であり、OSの専門家ではありません)
プロセスが 32 ビット プロセスとして実行されている場合、プロセスは 4GB の仮想アドレス空間しか認識しません。それ以上のものに対処することはできません。