活动Windows可执行文件的最小内存占用量

时间:2017-03-01 22:53:46

标签: windows memory executable portable-executable memory-footprint

我能想到的最小程序是无限循环的程序。在fasm它看起来像这样:

format PE console
entry start

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

从命令提示符编译并运行时,taskmanger报告它需要108kb的物理内存。从资源管理器运行时,它报告116kb。我在nasm中尝试了类似的程序,并尝试了不同的链接器选项,但108kb始终是最小的内存占用。

这是活动进程可以拥有的绝对最小内存占用量吗?是否可能变小?

1 个答案:

答案 0 :(得分:1)

不确定为什么这是一个有用的练习,任何实际做任何有用的应用程序都会加载至少几个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成员,但堆栈的默认值通常只有一页,这些值会向上舍入,因此将它们设置得更低不会获得任何收益。您无法控制PEB和TEB(s)的大小,我也不认为您可以避免创建默认进程堆。

大多数人倾向于关注smaller file size,而不是内存占用。您可以在32位Windows上创建的最小可用PE EXE文件是133 bytes。如果你没有导入任何东西,你可以将它降低到97字节,但它不会在Windows 2000上运行,因为它假定你从kernel32导入一些东西。这些文件是hacks并将PE标头放在DOS标头等的顶部。

如果您的目标只是低于108kb,那么我会在Windows 95或NT 4上尝试97字节的EXE文件。在Windows 95上,所有主要系统.DLL都由所有进程共享。