0

我认为最小的程序是无限循环的程序。在fasm中,它看起来像这样:活动Windows可执行文件的最小内存空间

format PE console 
entry start 

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

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

这是一个活动进程可以拥有的绝对最小内存空间吗?可以变小吗?

+0

您正在使用哪个链接器?并使用链接器选项? – Anders

+0

这与Windows版本非常相关。在你的进程中加载​​了'ntdll.dll'和'kernel32.dll'(+'kernelbase.dll'从win7开始)。初始化不同的内存结构..这个〜100kb不是你的小exe,而是系统dll,PEB,TEB,堆栈等在什么是实际问题? – RbMm

+0

@Anders for fasm,我只是直接用fasm来编写它。在nasm中,我使用GoLink以及Microsoft的链接器。我玩堆/栈大小,但不能减少最小值。 – ChrisD

回答

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,而不是内存占用。您可以创建的最小可用PE EXE文件是32位Windows上的133 bytes。如果你没有导入任何东西,你可以把它减少到97字节,但它不会在Windows 2000上运行,因为它假设你从kernel32导入了一些东西。这些文件是黑客并将PE标头放在DOS标头的顶部等。

如果你的目标是简单地得到108kb,那么我会尝试在Windows 95或者NT 4上的97字节的EXE文件。在Windows 95所有主要系统.DLL都由所有进程共享。

+0

谢谢。正如我所提到的,我使用Window的任务管理器来测量物理内存。这是在32位Windows 10上。 – ChrisD

+0

多年来,任务管理器已经改变了不同列的含义,所以它可能不是最好的工具。从SysInternals/TechNet尝试Process Explorer和VMMap。 – Anders