質問

私が読んでいる C/C++経由のWindows. 。そして、大きなファイルをメモリにマッピングできるのかどうかも疑問です。

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

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

役に立ちましたか?

解決

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

  • ntdll.dll
  • カーネル32.dll
  • yourApplication.exe

yourApplication.exe はデフォルトで 0x00400000.exe にロードされますが、このアドレスは変更できます。ntdll.dll と kernel32.dll は、0x7Dxx0000 の上位範囲の通常のロード アドレスでロードされます。

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

したがって、/3GB スイッチを使用して Windows を起動した場合でも、非常に大きな PE ファイルを読み込むのに十分な連続した領域がどこにもありません。

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

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

他のヒント

いいえ、あなたはできません - あなたは関係なく、ページングファイルの設定の、あなたのVAスペースを排気します。

は私は実行可能イメージ(PEヘッダに記載されている)のサイズまで、ファイル全体がマッピングされているとは思いません。自己解凍アーカイブだから> 2ギガバイトが可能でなければなりません。コードは、PEイメージの終了後、ファイルの後半からデータを抽出するために、標準的なファイルI / Oを使用しなければならない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top