不确定为什么这是一个有用的练习,任何真正有用的应用程序都会加载至少两个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 header的SizeOfStackCommit
和SizeOfHeapCommit
成员,但堆叠系统的默认通常只有一个页面,这些值四舍五入所以设置他们降低不会给你带来什么。您无法控制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都由所有进程共享。
您正在使用哪个链接器?并使用链接器选项? – Anders
这与Windows版本非常相关。在你的进程中加载了'ntdll.dll'和'kernel32.dll'(+'kernelbase.dll'从win7开始)。初始化不同的内存结构..这个〜100kb不是你的小exe,而是系统dll,PEB,TEB,堆栈等在什么是实际问题? – RbMm
@Anders for fasm,我只是直接用fasm来编写它。在nasm中,我使用GoLink以及Microsoft的链接器。我玩堆/栈大小,但不能减少最小值。 – ChrisD