2

私はc/c++経由でWindowsを読んでいます。そして、大きなファイルをメモリにマップできるのではないかと思います。

アプリケーションを実行すると、PEファイルがプロセスアドレス(ユーザーパーティション)にマップされます。

32ビットWindowsでは、大きなファイル(2GBより大きい)をユーザーパーティションにロードできますか?またはそれは失敗しますか?
可能であれば、ページングファイルは読み込みに役立ちますか?

4

3 に答える 3

2

いいえ、できません。ページングファイルの設定に関係なく、VAスペースを使い果たしてしまいます。

于 2010-03-22T16:20:44.950 に答える
1

32ビットWindowsではこれを行うことはできません。これを実行したいプログラムには、少なくとも3つのモジュールがロードされます。

  • ntdll.dll
  • kernel32.dll
  • yourApplication.exe

yourApplication.exeはデフォルトで0x00400000.exeで読み込まれますが、そのアドレスは変更できます。ntdll.dllとkernel32.dllは、0x7Dxx0000の高い範囲の通常のロードアドレスでロードされます。

Vista以降のオペレーティングシステムでは、ロードアドレスがランダム化されるため、上記の段落は当てはまりませんが、dllはメモリの最初の2GBの独自のアドレスに引き続き存在します。

したがって、/ 3GBスイッチでWindowsを起動した場合でも、非常に大きなPEファイルをロードするのに十分な連続スペースがどこにもありません。

さまざまなDLLが読み込まれる場所を把握したい場合は、VMValidator(無料)を使用してアプリのアドレス空間を視覚化します。仮想メモリビューには、メモリのグラフィック表現(4Kbページあたり1ピクセル)が表示されます。ページビューと段落ビューには、各メモリページとメモリ段落の実際の仮想メモリステータスが表示されます。

64ビットWindowsの場合、2GB 64ビットPEファイルをロードできる場合があります。メモリにロードできるように、十分な連続スペースが必要です。それがうまくいくかどうかについては、私には言えませんが、あなたはそれをテストする必要があります。

于 2010-03-29T19:05:35.370 に答える
1

ファイル全体がマップされているとは思いません。実行可能イメージのサイズ(PEヘッダーにリストされている)までしかマップされていません。したがって、2GBを超える自己解凍型アーカイブが可能であるはずです。コードは、PEイメージの終わりに続いて、ファイルの後半部分からデータを抽出するために、標準のファイルI/Oを使用する必要があります。

于 2010-03-22T16:26:09.597 に答える