0

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

format PE console
entry start

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

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

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

4

1 回答 1

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 中的导入表(除非这是一个全新的从未更新的 Windows 安装)。

理论上,您在“什么都不做”中真正可以控制的唯一事情。EXE 是可选标头SizeOfStackCommit的andSizeOfHeapCommit成员,但堆栈的默认值通常只有一页,并且这些值被四舍五入,因此将它们设置得较低不会获得你什么。您无法控制 PEB 和TEB (s) 的大小,我认为您无法避免创建默认进程堆。

大多数人倾向于关注较小的文件大小,而不是内存占用。您可以创建的最小可用 PE EXE 文件在 32 位 Windows 上为133 字节。如果您不导入任何内容,您可以将其减少到 97 字节,但它不会在 Windows 2000 上运行,因为它假定您从 kernel32 导入某些内容。这些文件是 hack 并将 PE 头放在 DOS 头等之上。

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

于 2017-03-02T00:07:24.120 回答