1

テスト用に Windows 8 の 32 ビット プログラムを作成しようとしています。テストには大きな割り当てが含まれており、問題が発生しています。OS は /3GB で起動し、マシンには 8GB とページ ファイルがあり、プログラムは でリンクされていた/LARGEADDRESSAWAREので、メモリの制約はありません。(一部の型が定義されているため、テストに 32 ビット プログラムを使用することが重要です。たとえば、 a size_t)。

new問題は、またはから 2GB (0x80000000) のメモリを割り当てることができないことですVirtualAllocnewで投げbad_allocVirtualAlloc返しNULLますERROR_NOT_ENOUGH_MEMORY

以前のバージョンの Windows では、3GB のアドレス空間は、アプリケーションに 0x00000000 から 0xBFFFFFFF が与えられ、OS が 0xC0000000 から 0xFFFFFFFF を使用することを意味していました (Richter のProgramming Applications for Windowsまたは Solomon and Russinovich のWindows Internalsを参照してください)。原則として、それは私が理論的なスペースを持っていることを意味すると信じています。

x64 に切り替えると、すべてが期待どおりに機能します。非常に明白な何かが欠けているのではないかと思いますが、何がわからないのですか (アドレス空間の真ん中にある共有メモリ領域など)。

32 ビット マシンで 0x80000000 の割り当てを実行する方法はありますか?

4

2 に答える 2

4

以前のバージョンの Windows では、3GB のアドレス空間は、アプリケーションに 0x00000000 から 0xBFFFFFFF が与えられ、OS が 0xC0000000 から 0xFFFFFFFF を使用することを意味していました (Richter の Programming Applications for Windows または Solomon and Russinovich の Windows Internals を参照してください)。原則として、それは私が理論的なスペースを持っていることを意味すると信じています。

Windows 8 では何も変わっていません。あなたが述べたことは今でも真実です。32 ビット システムで 2GB のメモリ ブロックを予約できるようにするには、少なくとも次の条件を満たす必要があります。

  1. あなたのプロセスは大きなアドレスを認識しています。
  2. システムは/3GB スイッチで起動されます。
  3. プロセスの仮想アドレス空間には、サイズが 2 GB の未予約のアドレス範囲があります。

最初の 2 つの条件を保持するように調整するのは簡単ですが、3 番目の条件を制御するのは困難です。プロセスが 32 ビット プロセスで 2GB の連続した範囲のアドレス空間を見つけることができると想定しないでください。それは非現実的な期待です。

テスト システムが 64 ビット システムの場合は、32 ビット システムでのテストも検討する必要があります。たとえば、64 ビット システムでは /3GB ブート オプションはなく、すべての大きなアドレスを認識する 32 ビット プロセスには 4GB のアドレス空間があります。もちろん、あなたはまだ私のリストの項目 3 の対象です。

于 2013-05-20T20:53:28.273 に答える
2

/3GB オプションは、64 ビット オペレーティング システムでは意味がなく、Vista 以降ではサポートされなくなりました。このオプションは、Windows 8 など、BCDEdit を使用する最新の 32 ビット バージョンの Windows での IncreaseUserVA です。これは、2 GB を割り当てられない理由の最も簡単な説明です。

オペレーティング システムは上位ページを必要としないため、32 ビット プロセスは4 GB64 ビット オペレーティング システムでアドレス空間を取得します。ただし、アドレスの上位ビットを 0 にするなどの無分別なポインター シェナニガンを使用しないことをオペレーティング システムに伝えることで、オプトインする必要があります。 /LARGEADDRESSAWARE link.exe または editbin.exe オプションが必要です。

それでも 4 GB を割り当てられるわけではなく、現在取得している 2 GB のアドレス空間で同じ問題が発生しています。アドレス空間は、コードとデータの間で共有されます。使用可能なスペースを 2 つに分割するには、厄介なベース アドレスを持つ DLL が1 つだけ必要です。

于 2013-05-20T21:26:40.840 に答える