2009-02-20 9 views
8

私が理解しているところでは、32ビットプロセスは/ 3GBスイッチなしで32ビットのウィンドウで2GBのメモリにしかアクセスできず、そのメモリのいくつかは悪徳の理由でOSに取り込まれます。これは私の経験と絡み合っているようですが、まだ十分なメモリがあるにもかかわらず、メモリの例外を除いて1.2〜1.5GBのRAMに達したときにクラッシュするアプリがあります。32ビットプロセスは64ビットWindows OS上でより多くのメモリにアクセスできますか?

私の質問は、この32ビットアプリケーションを64ビットウィンドウに移動すると1.5GBほどのメモリにアクセスできるようになります。または、アプリケーション自体を64ビットにアップグレードする必要がありますか?

+0

32ビットポインタが示唆する完全な4 Gbにアクセスできますか?いくつかの作業をしなくても4Gb以上の問題は解決できませんが、32ビットWindowsより多くの機能を使用できるかどうかは私自身が興味を持っています。 – erickson

答えて

12

新しいバージョンのVisual Studioには、32ビットアプリケーションを「大きなアドレス空間に対応」させる新しいフラグがあります。基本的には、64ビットバージョンのウィンドウにロードされている場合、4GB(32ビットポインターの制限)が取得されます。これは確かに、Windowsの32ビット版で得られる2,3 GBよりも優れています。 http://msdn.microsoft.com/en-us/library/aa366778.aspxを参照してください:

最も顕著なのは、それは言う:

メモリとアドレススペース の制限プラットフォームによって異なり、オペレーティングシステム、 とLOADED_IMAGE構造の IMAGE_FILE_LARGE_ADDRESS_AWARE値 と 4ギガバイトかどうかによってチューニング(4GT)が使用中です。 IMAGE_FILE_LARGE_ADDRESS_AWAREが に設定されているか、または /LARGEADDRESSAWAREリンカーオプションを使用してクリアされています。

も参照してください:http://msdn.microsoft.com/en-us/library/wz223b1z.aspx

1

あなたのアプリはポインタサイズで制限されます(例では32ビット)。

あなたのアプリがより多くのメモリにアクセスしていた場合、アプリケーションが16ビットポインタとオフセットを使って16ビットのメモリ空間にアクセスする16ビット日のようなセグメント分割メモリアーキテクチャが必要になります。

1

WOW64は、実際の64ビット・ポインタに32ビット・ポインタを翻訳し、64ビットのWindows上で32ビットWindowsアプリケーションを使用できます。実際には32ビットのアドレッシングで4GBのメモリにアクセスできるはずです。

+0

32ビットコードが実行されている間は、64ビットへの32ビットポインタの変換はありません。 WOW64は、64ビットコードの内外への移行時にのみ関係します。 –

4

はい、適切な状況下では、Windows上の32ビットプロセスは、通常は制限されている2Gbではなく、4GBのメモリ全体にアクセスできます。

このために仕事に、あなたは以下のものが必要です。アプリは64ビットOS

  • 上で実行されている必要があり

    • アプリは/ LARGEADDRESSAWAREフラグを指定してコンパイルする必要があります。
    • この場合、アプリが実際に正しく動作することを確認するテストが必要です。 ;)(具体的には、2GB境界より下のアドレスを指し示すすべてのポインタに依存するコードはここではうまく動作しません)
  • 関連する問題