0

私が考えることができる最小限のプログラムは、無期限にループするものです。 FASMでは、それは次のようになります。コンパイルして、コマンドプロンプトから実行するとアクティブなWindowsのメモリフットプリントの最小値

format PE console 
entry start 

section '.text' code readable executable 
start: 
    JMP start 

、taskmangerは、それが物理メモリの108キロバイトをとり報告します。 Explorerから実行すると、116kbと報告されます。似たようなプログラムをnasmで試してみましたが、異なるリンカーオプションも試しましたが、108kbは常に最小のメモリフットプリントでした。

これはアクティブなプロセスが持つことができる絶対最小メモリフットプリントですか?もっと小さくすることは可能ですか?

+0

あなたはどちらのリンカーを使用していますか?リンカオプションは使用されていますか? – Anders

+0

これはWindowsのバージョンに非常に関連しています。あなたのプロセスで 'ntdll.dll'と' kernel32.dll'(+ 'kernelbase.dll'はwin7から始まります)をロードしました。初期化された別のメモリ構造..この〜100kbはあなたの小さなexeではなく、システムのDLL、PEB、TEB、スタックなどを取る実際の問題は何ですか? – RbMm

+0

@ Fasmのためのアンダー、私はちょうどストレートにそれを遵守した。 nasmではGoLinkとMicrosoftのリンカーを使用しました。私はヒープ/スタックの大きさで演奏しましたが、その最小値を減らすことはできませんでした。 – ChrisD

答えて

1

なぜこれが便利な練習であるのか分かりませんが、実際に何か有用なアプリケーションは、少なくとも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 headerSizeOfStackCommitSizeOfHeapCommitメンバーですが、スタックのデフォルトは通常、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はすべてのプロセスによって共有されます。

+0

ありがとうございます。私が言及したように、私は、物理メモリを測定するためにWindowのタスクマネージャを使いました。これは32ビットWindows 10上にあります。 – ChrisD

+0

タスクマネージャーは長年にわたって異なる列の意味を変更しているため、おそらく使用するのに最適なツールではありません。 SysInternals/TechNetからProcess ExplorerとVMMapを試してみてください。 – Anders

関連する問題