不太确定为什么这是一个有用的练习,任何实际执行任何有用的应用程序都将加载至少几个 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 都由所有进程共享。