Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
活动Windows可执行文件的最小内存占用_Windows_Memory_Executable_Portable Executable_Memory Footprint - Fatal编程技术网

活动Windows可执行文件的最小内存占用

活动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总是最小的内存占用 这是活动进程可以拥有的绝对最小内存占用吗

我能想到的最小的程序是一个无限循环的程序。在fasm中,它如下所示:

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。