2016-06-25 1 views
1

私は現在FreeBSDでゲームを開発中です。私はclangを32ビットバイナリとしてコンパイルしており、64ビットシステム(32GBのRAMをこのシステムで使用しています)で動作させていますが、4GBしか使用していないので、4GB以上のRAMを使用する必要があります。
複数のゲームインスタンスを実行しても、4GB以上のRAMにはアクセスできません。FreeBSDで32ビットアプリケーションで4GB以上のRAMを使用できます

また、64ビットシステムでコンパイルしようとしましたが、奇妙な動作があります。私はバグがたくさんある。

Windows上のVisual Studioには、/LARGEADDRESSAWAREというオプションがあります。つまり、32ビットアプリケーションでRAMを増やすことができますか、間違っていますか?
バイナリでRAMをさらに使用できるようにするために、Windowsのように指定できるフラグはありますか?私はmcmodel=large(またはmedium)について何かを読んだことがありますが、これが私が探しているものではないかと思います。
クロスコンパイルはどうですか?誰かが私がそれについての良い情報をどこで見つけることができるか知っていますか?
ありがとうございます。

+2

2^32/4GB == 1 –

+6

"64ビットシステムでコンパイルしようとしましたが、奇妙な振る舞いをしています。多くのバグがあります。" - あなたはそれらのバグを修正したいと思うでしょう。自分で解決できない具体的な問題があれば、それは良い質問になるかもしれません。これはWindowsにも当てはまります: '/ LARGEADDRESSAWARE'はあなたのアプリケーションに4GB以上のアドレスを指定させません。 – hvd

+0

メモリマップされたファイルを調べます。 – nwp

答えて

4

4GiBは32ビット整数でのみアドレス指定できます。 2^32 = 4294967296 = 4 * 1024 * 1024 * 1024

32ビットの実行ファイルに4GiB以上のアドレス空間を割り当てる方法はありません。それは数学的な限界です。確かに、プロセス内で4GiB以上のデータを処理するには、スワップと物理アドレス拡張を使用できますが、4GiB以上は処理できません。

+2

PAEはカーネルモードにのみ関係します。ユーザーモードに相当するのは、 'mmap'のようなものです。どちらの方法でも、2^32バイトを超えるアドレスに対応する唯一の方法は、アドレス空間の一部をスワップ(または「バンク」)することです。 –

+0

@Rhymoid:確かにPAEはカーネルモードにしか関係しませんが、私は可能な限り一般的な答えと一般的なものを保持したいと思っていました。 32ビットはアドレス空間の4 GiBを意味し、それだけです。 – datenwolf

0

4GB以上のRAMを使用するには、64ビット版のFreeBSDが必要です。これは基本的に "i386"アーキテクチャではなく "amd64"を意味します。 64ビットシステムで32ビットバイナリを実行することができます。これにより、複数のインスタンスが4GB以上のRAMを使用できるようになります。明らかに、単一のものはそれ以上のものに対処することはできません。

+0

私が指定したように、32GBのRAMとFreeBSD x64を持つ専用サーバーの下で30インスタンスを使用して実行しますが、私は常に26GB以上の空きRAMを持っています。また、私はRAMを使用するmysqlサーバーを持っています。私は思うより多くのRAMを使用する必要があります。 – Shockwave

+0

それはすべきです。実際の統計情報を貼り付けることはできますか? –

関連する問題