なぜこれが便利な練習であるのか分かりませんが、実際に何か有用なアプリケーションは、少なくとも2つのWindows .DLLをロードすることになり、おそらくメモリ使用量がかなり増加します。
108kbは、どのアプリケーションを測定したのかわからないときは、あまり言いません。
メモリフットプリントは、Windowsのバージョンによっても異なります。 Windows 7以降には3つのコア.DLLがあります。 ntdll、kernelbase、kernel32がありました。以前のバージョンはntdllとkernel32しか持っていませんでした。 64ビットWindows上で32ビットアプリケーションを実行している場合は、プロセスにwow64、wow64cpu、およびwow64winもロードされます。 Windows 2000を除くすべてのバージョンで、ローダーは自動的にkernel32とその依存関係を自動的に読み込みます。各.DLLには避けられないオーバーヘッドがあります。 PEBにロードされたロード済み.DLLのリンクリストがあり、他のすべてのページを他のプロセスと共有できる場合でも、ローダーはおそらく各.DLL(unlessこれは新しく更新されていないWindowsインストールです)のインポートテーブルを変更します。
理論的にはあなたが本当に「何もしない」で.EXEをコントロールの上に持っている唯一の事はoptional headerのSizeOfStackCommit
とSizeOfHeapCommit
メンバーですが、スタックのデフォルトは通常、1ページだけであり、これらの値がそのように設定切り上げされています彼らはあなたに何も得られません。 PEBとTEB(s)のサイズを制御することはできません。デフォルトのプロセスヒープの作成を避けることはできません。
ほとんどの人はメモリフットプリントではなくsmaller file sizeに集中する傾向があります。あなたが作ることができる最小限の使用可能なPE EXEファイルは、32ビットWindows上で133 bytesです。何もインポートしなければ、97バイトまで取得できますが、それはWindows 2000上では実行されません。これは、kernel32から何かをインポートすることを前提としているからです。これらのファイルはハッキングされ、DOSヘッダーの上にPEヘッダーを配置します。
目標が108kb未満の場合、97バイトのEXEファイルをWindows 95またはNT 4で試してみます。Windows 95すべての主要なシステム.DLLはすべてのプロセスによって共有されます。
あなたはどちらのリンカーを使用していますか?リンカオプションは使用されていますか? – Anders
これはWindowsのバージョンに非常に関連しています。あなたのプロセスで 'ntdll.dll'と' kernel32.dll'(+ 'kernelbase.dll'はwin7から始まります)をロードしました。初期化された別のメモリ構造..この〜100kbはあなたの小さなexeではなく、システムのDLL、PEB、TEB、スタックなどを取る実際の問題は何ですか? – RbMm
@ Fasmのためのアンダー、私はちょうどストレートにそれを遵守した。 nasmではGoLinkとMicrosoftのリンカーを使用しました。私はヒープ/スタックの大きさで演奏しましたが、その最小値を減らすことはできませんでした。 – ChrisD