1 つの EXE と複数の DLL で構成される 32 ビット アプリケーションがあります。EXE は、/LARGEADDRESSAWARE
フラグを設定してビルドされています。したがって、64 ビット OS では 4 GB のユーザー アドレス空間を取得する必要があります。しかし、一部の 64 ビット Win 7 システムでは、2 GB のユーザー アドレス空間しか得られません。
それが重要な場合、物理メモリは 8 GB です。この動作の理由は何ですか?
1 つの EXE と複数の DLL で構成される 32 ビット アプリケーションがあります。EXE は、/LARGEADDRESSAWARE
フラグを設定してビルドされています。したがって、64 ビット OS では 4 GB のユーザー アドレス空間を取得する必要があります。しかし、一部の 64 ビット Win 7 システムでは、2 GB のユーザー アドレス空間しか得られません。
それが重要な場合、物理メモリは 8 GB です。この動作の理由は何ですか?
MSDN を参照した後、次の情報を見つけました。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366770(v=vs.85).aspx (で使用されるページ( http://msdn.microsoft.com/ en-us/library/windows/desktop/aa366589(v=vs.85).aspx ) ) の説明は次のとおりです。MEMORYSTATUSEX
GlobalMemoryStatusEx
ullTotalVirtual
この値は、x86 プロセッサ上のほとんどの 32 ビット プロセスで約 2 GB であり、4 ギガバイト チューニングが有効になっているシステムで実行されているラージ アドレス対応の 32 ビット プロセスでは約 3 GB です。
4GB のチューニング ページはhttp://msdn.microsoft.com/en-us/library/windows/desktop/bb613473(v=vs.85).aspxで、次のように書かれています。
Windows の 64 ビット エディションでは、IMAGE_FILE_LARGE_ADDRESS_AWARE フラグでマークされた 32 ビット アプリケーションは、4 GB のアドレス空間を利用できます。
Windows Server 2003 の Itanium エディション: SP1 より前の 32 ビット プロセスでは、2 GB のアドレス空間しか使用できませんでした。
また、システムがサポートする合計メモリを確認する場合は、メモリ制限ページ ( http://msdn.microsoft.com/en-us/library/aa366778.aspx#memory_limits ) が便利です。
ただし、実際に役立つ情報は、Mark Russinowich のブログ ( http://blogs.technet.com/b/markrussinovich/archive/2008/07/21/3092070.aspx ) から入手できます。
32 ビット クライアント SKU のライセンス制限は 4 GB ですが、実際の制限はそれよりも低く、システムのチップセットと接続されているデバイスによって異なります。その理由は、物理アドレス マップには RAM だけでなくデバイス メモリも含まれており、x86 および x64 システムはすべてのデバイス メモリを 4GB アドレス境界より下にマップして、処理方法がわからない 32 ビット オペレーティング システムとの互換性を維持するためです。 4GB を超えるアドレス。
したがって、結論は、はい、これはシステムの構成に依存する可能性があるということです。おそらく、各システムで得られるメモリの量といくつかの重要なシステム構成設定を含む表を使用して質問を完了することができます。この場合、パターンを発見できるかもしれません.
問題は、アプリケーション全体が大きなアドレスを認識している必要があるため、ポインターが署名されていないものとして扱われることです。
ただし、「一部の」システムで、使用されている DLL の一部が大きなアドレスを認識していない場合、プログラム全体が大きなアドレスを認識していません。
http://blogs.msdn.com/b/oldnewthing/archive/2010/09/22/10065933.aspx