4

WindowsでのPEファイル(exe)の最小ファイルサイズはいくつですか?そして、最小メモリ割り当て?

次のコードをアセンブルしました(VS 10に付属のMASM(ml.exe)とlink.exeを使用)。kernel32.libとExitProcessを除外 できません。除外すると、プログラムがクラッシュします。

; Assmebly options
.386
.MODEL FLAT, STDCALL
option casemap:none

; Include Libs
includelib kernel32.lib

; Imported symbols
ExitProcess PROTO :Dword
Sleep PROTO :Dword

; Code
.CODE

start:
    invoke Sleep, 10000
    invoke ExitProcess, 0
END start

Sleepコマンドは、プログラムが終了する前にメモリ使用量を読み取ることができるようにするためにのみ含まれています。

ここで、次のことを測定します。.exeファイルのサイズは正確に2.5 KB(user32.libとMessageBoxAを含めると、サイズは3 KB->ブロックになりますか?)、アプリケーションの実行時に136 KBのRAMを使用します(Vista 32ビット)。

このような単純なプログラムでは、それだけのメモリではありませんか?exeファイルが非常に大きく、RAM要件がexeファイルよりもはるかに大きいのはなぜですか?

最小のメモリサイズはありますか?ファイルはどうですか?サイズが0.5KBのブロックに編成されているように見えますが、この最短のプログラムでは0.5KBではないでしょうか。

これについてはどこで読むことができますか(チェックアウトするhttp://msdn.microsoft.com/en-us/magazine/cc301805.aspxを除く)?

ありがとう(ここで私の最初の質問)

4

3 に答える 3

8

ntdll.dllはすべてのプロセスにマップされ、コードの実行を開始する前に多くの基本的な初期化を行います。これにより、常に少量のプライベートメモリが割り当てられます。見てくださいLdrpInitializeProcess; ここに物事の小さなリストがあります:

  • プロセスヒープを作成します。
  • 現在のスレッドのアクティベーションコンテキストスタックを設定します。
  • いくつかのクリティカルセクションを初期化します。これにより、ほとんどの場合、メモリが割り当てられます。

また、プロセスにロードされる他のDLL(kernel32.dll、user32.dllなど)は、おそらくそれらのDllMain関数でメモリ自体を割り当てます。

編集:私が作成したこの簡単なテストプログラムを見てください:

最小限のプログラム

これは完全にネイティブなプログラム(Win32なし)であり、ntdll.dllから2つの関数をインポートします:NtDelayExecutionNtTerminateProcess。これはプログラムと非常によく似ており、スリープ以外は何もしませんが、100kBのプライベートメモリを使用します。プログラムと同じように、ファイルのサイズは2.5kBです。

于 2010-11-30T06:02:39.643 に答える
6

まだ読んでいない場合、これはまさにこの主題に関する非常に良いページです。

http://www.phreedom.org/research/tinype/

于 2010-11-29T23:57:27.587 に答える
2

「136KBのメモリを使用している」と表示されている場合でも、その大部分はすべてのアプリケーション間で共有されていることを忘れないでください。本当にプライベートバイトをチェックアウトする必要がありますが、それでも、デフォルトのヒープ予約などの他の要因があります。WindowsOSは、RAMを節約するよりもアプリを高速に実行することを望んでいます。無駄なメモリは何の役にも立ちません。

于 2010-11-30T05:50:29.583 に答える