活动Windows可执行文件的最小内存占用
我能想到的最小的程序是一个无限循环的程序。在fasm中,它如下所示:活动Windows可执行文件的最小内存占用,windows,memory,executable,portable-executable,memory-footprint,Windows,Memory,Executable,Portable Executable,Memory Footprint,我能想到的最小的程序是一个无限循环的程序。在fasm中,它如下所示: format PE console entry start section '.text' code readable executable start: JMP start 从命令提示符编译和运行时,taskmanger报告需要108kb的物理内存。从资源管理器运行时,报告116kb。我在nasm中尝试了类似的程序,也尝试了不同的链接器选项,但108kb总是最小的内存占用 这是活动进程可以拥有的绝对最小内存占用吗
format PE console
entry start
section '.text' code readable executable
start:
JMP start
从命令提示符编译和运行时,taskmanger报告需要108kb的物理内存。从资源管理器运行时,报告116kb。我在nasm中尝试了类似的程序,也尝试了不同的链接器选项,但108kb总是最小的内存占用
这是活动进程可以拥有的绝对最小内存占用吗?有可能变小吗?不太清楚为什么这是一个有用的练习,任何实际执行有用操作的应用程序都将加载至少两个Windows.dll,这可能会大大增加内存使用量 如果您不说出使用哪个应用程序进行测量,108kb并不能告诉我们多少 内存占用也取决于Windows版本。在Windows7和更高版本上有3个core.dll;ntdll、kernelbase和kernel32,而以前的版本只有ntdll和kernel32。如果您在64位Windows上运行32位应用程序,您的进程中还将加载wow64、wow64cpu和wow64win。在除Windows 2000之外的所有版本上,加载程序都会自动为您加载内核32及其依赖项。每个.DLL都有一些不可避免的开销。存在存储在中的已加载.DLL的链接列表,加载程序可能会修改每个.DLL中的导入表(这是一个从未更新过的新Windows安装),即使所有其他页面都可以与其他进程共享 理论上,在“不做任何事情”中,您真正可以控制的唯一事情是。EXE是的
SizeOfStackCommit
和SizeOfHeapCommit
成员,但堆栈的默认值通常只有一页,并且这些值是向上舍入的,因此将它们设置得更低不会给您带来任何好处。您无法控制PEB和的大小,我认为您无法避免创建默认进程堆
大多数人倾向于关注内存,而不是内存占用。可以创建的最小可用PE EXE文件位于32位Windows上。如果您不导入任何内容,则可以将其减少到97字节,但它将不会在Windows 2000上运行,因为它假定您从内核32导入了一些内容。这些文件是黑客攻击,将PE头放在DOS头的顶部等
如果你的目标仅仅是在108kb以下,那么我会在Windows95或者NT4上尝试97字节的EXE文件。在Windows 95上,所有主系统。DLL由所有进程共享。您使用的是哪个链接器?使用了链接器选项吗?这与windows版本非常相关。在您的进程中加载了
ntdll.dll
和kernel32.dll
(++kernelbase.dll
从win7开始)。初始化了不同的内存结构。。这个~100kb不是你的小exe,而是系统DLL、PEB、TEB、堆栈等。实际问题是什么?@Anders对于fasm,我只是直接按照fasm来做。在nasm中,我使用了GoLink和微软的链接器。我对堆/堆栈大小进行了调整,但无法降低最小值。@RbMm这不是问题,我只是感兴趣。谢谢。正如我提到的,我使用Window的任务管理器来测量物理内存。这是在32位Windows 10上。任务管理器多年来改变了不同列的含义,因此它可能不是最好的工具。从SysInternals/TechNet尝试Process Explorer和VMMap。