4

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

我组装了(使用 VS 10 附带的 MASM (ml.exe) 和 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 --> 块?)并且应用程序在运行时使用 136 KB RAM(Vista 32 位)。

对于这样一个简单的程序来说,这不是多少内存吗?为什么exe文件这么大,内存需求比exe文件大很多?

有一些最小的内存大小吗?文件呢?看起来它是以 0.5 KB 大小的块组织的,但对于这个可能最短的程序来说,它不是 0.5 KB 吗?

我在哪里可以阅读到这方面的信息(除了http://msdn.microsoft.com/en-us/magazine/cc301805.aspx,我将查看它)?

谢谢(我在这里的第一个问题)

4

3 回答 3

8

ntdll.dll 被映射到每个单独的进程中,并在您的代码开始运行之前进行大量的基本初始化。这总是会导致分配少量的私有内存。看看LdrpInitializeProcess;这是一个小清单:

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

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

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

最小程序

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

于 2010-11-30T06:02:39.643 回答
6

如果您还没有阅读,这是一个关于这个主题的非常好的页面:

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

于 2010-11-29T23:57:27.587 回答
2

请记住,尽管它可能会说“使用 136KB”的内存,但其中大部分是在所有应用程序之间共享的。您确实需要检查私有字节,即使那样,还有其他因素,例如默认堆保留等。Windows 操作系统宁愿您的应用程序运行得更快而不是节省 RAM - 浪费的内存没有任何帮助。

于 2010-11-30T05:50:29.583 回答