2009-02-25 5 views
15

Windowsアプリケーションの画像ヘッダーに/ LARGEADDRESSAWAREコンパイラフラグを使用してIMAGE_FILE_LARGE_ADDRESS_AWAREが設定されている場合、通常32ビットアプリケーションで2GBを超えるメモリを使用できるようになります32ビットオペレーティングシステムがboot.iniに3GBスイッチを設定している場合)。詳細については、MSDN article /3GBを参照してください。IMAGE_FILE_LARGE_ADDRESS_AWAREおよび3GB OSスイッチ

私の質問は、3GBスイッチが設定されていないシステムでこのアプリケーションを実行するとどうなりますか?それは単に無視されますか?または、アプリケーションは3GBのヒープを試して使用し、メモリ不足のエラーが発生するのはユーザースペースが2GBしかないからですか?

LARGEADDRESSAWAREスイッチは2GBのユーザースペースシステムでは無視されていますが、これに関する公式のMicrosoftドキュメントは見つかりませんでした。

ありがとうございます。

答えて

19

基本的にIMAGE_FILE_LARGE_ADDRESS_AWAREは、「上位ビットが設定されたアドレスが負ではなく、それを処理できることを知っています」とシステムに通知します。 システムが2GBを超えるユーザー・モード・アドレスを提供できるように準備されている場合は、それが実行されます。システムがそれらのアドレスを与える準備ができていない場合(つまり、/ 3GB設定なしの32ビットWindows OS)、プロセスはこれらのアドレスをとにかく得ることはできませんが、害はありません。

画像にIMAGE_FILE_LARGE_ADDRESS_AWAREビットが設定されている場合、/ 3GBスイッチをサポートしていない(または必要とする)Win64システムでは、2GBを超えるアドレススペースにアクセスできます。 32ビットアプリケーションでは4GBに近いアドレス空間が得られ、64ビットアプリケーションではプラットフォームに応じて7TBから8TBの巨大なアドレス空間が得られます(デフォルトでは64ビットのビルドでビットが設定されます)。

http://msdn.microsoft.com/en-us/library/aa366778.aspx#memory_limits

+0

注: 32ビットシステムで3Gbを使用する場合、自己責任でハードウェアとドライバを制御しないと、ブルースクリーニングの可能性が高くなります。 Win64では、32ビットプロセスで完全に安全な4Gbアドレスを提供します。また、バイナリを調整してフラグを設定することもできます。 – morechilli

+0

ハードウェアとドライバを制御しないとブルースクリーニングの可能性が高くなる可能性があります カーネルスペースが1 GBに下がるため、これは可能なドライバが多いメモリが足りなくなる。 – Todd

+1

トッド:うん、それだけではない。ドライバの多くは、単に "アドレスへのすべてのポインタ> 2GBがカーネル空間を指していると仮定するかもしれません。すべて<2GBはユーザ空間です。 – jalf

9

スイッチは無視できます。かつて、マイクロソフトは実際にはわかりやすい名前を思いついた。

フラグは、それが何を言っているかを正確に表しています。この画像ファイルはを認識しており、大きなアドレスが存在するです。 つまり、2GB境界より上のポインタが与えられた場合、クラッシュしません。

それだけです。 OSは、特別なプロセスを何ら処理する必要はありません。これは、の場合、 OSが2GB以上のメモリを提供できる場合、このプロセスはクラッシュすることなく処理できます。 1.5MBを超えるファイルを使用しないで、このフラグが設定されている単純なhello worldアプリケーションを作成することができます。 「3GBのメモリを使用したい」という意味ではなく、「メモリを要求すると、2GB境界を上回るか下回るかは気にしません」という意味です。

フラグはOSに特別な処理を要求しないので、特別な操作がなければOSは特別な操作を行わないだけです。

+0

非常に良い答えです。ありがとうございます。 – Zafar

関連する問題