私はc/c++経由でWindowsを読んでいます。そして、大きなファイルをメモリにマップできるのではないかと思います。
アプリケーションを実行すると、PEファイルがプロセスアドレス(ユーザーパーティション)にマップされます。
32ビットWindowsでは、大きなファイル(2GBより大きい)をユーザーパーティションにロードできますか?またはそれは失敗しますか?
可能であれば、ページングファイルは読み込みに役立ちますか?
私はc/c++経由でWindowsを読んでいます。そして、大きなファイルをメモリにマップできるのではないかと思います。
アプリケーションを実行すると、PEファイルがプロセスアドレス(ユーザーパーティション)にマップされます。
32ビットWindowsでは、大きなファイル(2GBより大きい)をユーザーパーティションにロードできますか?またはそれは失敗しますか?
可能であれば、ページングファイルは読み込みに役立ちますか?
いいえ、できません。ページングファイルの設定に関係なく、VAスペースを使い果たしてしまいます。
32ビットWindowsではこれを行うことはできません。これを実行したいプログラムには、少なくとも3つのモジュールがロードされます。
yourApplication.exeはデフォルトで0x00400000.exeで読み込まれますが、そのアドレスは変更できます。ntdll.dllとkernel32.dllは、0x7Dxx0000の高い範囲の通常のロードアドレスでロードされます。
Vista以降のオペレーティングシステムでは、ロードアドレスがランダム化されるため、上記の段落は当てはまりませんが、dllはメモリの最初の2GBの独自のアドレスに引き続き存在します。
したがって、/ 3GBスイッチでWindowsを起動した場合でも、非常に大きなPEファイルをロードするのに十分な連続スペースがどこにもありません。
さまざまなDLLが読み込まれる場所を把握したい場合は、VMValidator(無料)を使用してアプリのアドレス空間を視覚化します。仮想メモリビューには、メモリのグラフィック表現(4Kbページあたり1ピクセル)が表示されます。ページビューと段落ビューには、各メモリページとメモリ段落の実際の仮想メモリステータスが表示されます。
64ビットWindowsの場合、2GB 64ビットPEファイルをロードできる場合があります。メモリにロードできるように、十分な連続スペースが必要です。それがうまくいくかどうかについては、私には言えませんが、あなたはそれをテストする必要があります。
ファイル全体がマップされているとは思いません。実行可能イメージのサイズ(PEヘッダーにリストされている)までしかマップされていません。したがって、2GBを超える自己解凍型アーカイブが可能であるはずです。コードは、PEイメージの終わりに続いて、ファイルの後半部分からデータを抽出するために、標準のファイルI/Oを使用する必要があります。