活动窗口的最小内存足迹



我认为制作的最小程序是无限期循环的程序。在FASM中看起来像这样:

format PE console
entry start
section '.text' code readable executable
start:
    JMP start

从命令提示符进行编译并运行时,TaskManger报告需要108KB的物理内存。从Explorer运行时,它报告了116KB。我尝试了NASM中的类似程序,还尝试了不同的链接器选项,但108KB始终是最小的内存足迹。

这是主动过程可以拥有的绝对最小内存足迹吗?可能会变小吗?

不确定这是一个有用的练习,实际上有用的任何有用的应用都将加载至少几个Windows .dll,并且可能会增加内存使用情况位。

108KB当您不说使用哪种应用程序时,不会告诉我们太多。

内存足迹也取决于Windows版本。在Windows 7上,有3个核心.dll;ntdll,kernelbase和kernel32虽然以前的版本只有ntdll和kernel32。如果您在64位窗口上运行了一个32位应用程序,您还可以在您的过程中加载WOW64,WOW64CPU和WOW64WIN。除Windows 2000以外的每个版本上,加载程序将为您自动加载kernel32及其依赖项。每个.dll都有一些不可避免的开销。有一个链接的已加载.dll列表存储在PEB中,即使所有其他页面都可以与其他流程共享,也可能会在每个.dll中修改每个.dll中的导入表(除非这是新的永不更新Windows安装)。/p>

从理论上讲,您在"无所事事"中真正控制的唯一一件事是可选标题的SizeOfStackCommitSizeOfHeapCommit成员,但是堆栈的默认值通常只有一页,这些值是舍入的,因此设置为设置他们较低不会为您带来任何帮助。您无法控制卵石和TEB的大小,我认为您无法避免创建默认过程堆。

大多数人倾向于专注于较小的文件大小,而不是内存足迹。您可以创建的最小可用PE EXE文件是32位窗口上的133个字节。如果您没有导入任何内容,则可以将其降低到97个字节,但是它不会在Windows 2000上运行,因为它假设您从kernel32导入了一些东西。这些文件是hacks,并将PE标头放在DOS标题等上。

如果您的目标仅在108KB以下,那么我将尝试在Windows 95或NT 4上尝试97字节EXE文件。在Windows 95上,所有主要系统.dlls均由所有进程共享。

最新更新