Windows上PE文件(exe)的最小文件大小是多少?而最小的内存分配?

时间:2010-11-29 23:54:07

标签: windows memory exe masm

Windows上PE文件(exe)的最小文件大小是多少? 最小的内存分配?

我组装了(使用MASM(ml.exe)和VS 10附带的link.exe)以下代码: 我不能遗漏kernel32.lib和ExitProcess,如果我这样做,程序会崩溃。

; Assmebly options
.386
.MODEL FLAT, STDCALL
option casemap:none

; Include Libs
includelib kernel32.lib

; Imported symbols
ExitProcess PROTO :Dword
Sleep PROTO :Dword

; Code
.CODE

start:
    invoke Sleep, 10000
    invoke ExitProcess, 0
END start

仅包含睡眠命令,以便能够在程序结束前读取内存使用情况。

现在我测量以下内容:.exe文件的大小正好是2.5 KB(如果我包含user32.lib和MessageBoxA,它的大小变为3 KB - > gt?块?)应用程序使用136 KB RAM时它运行(Vista 32bit)。

对于这样一个简单的程序来说,这不是那么多的记忆吗?为什么exe文件如此之大,RAM要求比exe文件大得多?

是否有一些最小的内存大小?那档案怎么样?看起来它的大小是0.5 KB的块,但是对于这个最短的程序,它不是0.5 KB吗?

我在哪里可以读到这个(除了我要检查的http://msdn.microsoft.com/en-us/magazine/cc301805.aspx)?

谢谢(我的第一个问题)

3 个答案:

答案 0 :(得分:7)

ntdll.dll映射到每个进程,并在代码开始运行之前进行大量基本初始化。这将始终导致分配少量私有内存。看看LdrpInitializeProcess;这里有一小部分内容:

  • 它创建进程堆。
  • 它为当前线程设置激活上下文堆栈。
  • 初始化几个关键部分。这几乎总是会导致分配内存。

此外,加载到您的进程中的其他DLL(例如kernel32.dll,user32.dll)可能会在DllMain函数中自行分配内存。

编辑:看看我创建的这个简单的测试程序:

Minimal program

这是一个完全原生的程序(没有Win32),只从ntdll.dll导入两个函数:NtDelayExecutionNtTerminateProcess。它与你的程序非常相似,即使除睡眠之外它什么都不做,它仍然使用100 kB的私人内存。文件大小为2.5 kB,就像你的程序一样。

答案 1 :(得分:6)

如果你还没有读过这篇文章,这是一个关于这个主题的非常好的页面:

http://www.phreedom.org/research/tinype/

答案 2 :(得分:2)

请记住,即使它可能会说“使用136KB”的内存,但大多数内存在所有应用程序之间共享。你真的需要查看私有字节,即使这样,还有其他因素,如默认堆预留等.Windows操作系统宁愿你的应用程序运行得比保存RAM更快 - 浪费的内存对任何事情没有帮助。

相关问题