mas*_*ilo 4 memory windows 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
Run Code Online (Sandbox Code Playgroud)
包含Sleep命令只是为了能够在程序结束之前读取内存使用情况.
现在我测量以下内容:.exe文件的大小正好是2.5 KB(如果我包含user32.lib和MessageBoxA,它的大小变为3 KB - >块?)并且应用程序在运行时使用136 KB RAM(Vista 32位).
对于这样一个简单的程序来说,这有多少内存?为什么exe文件如此之大,RAM要求比exe文件大得多?
是否有一些最小的内存大小?那档案怎么样?看起来它的大小是0.5 KB的块,但是对于这个最短的程序,它不是0.5 KB吗?
我在哪里可以读到这个(除了http://msdn.microsoft.com/en-us/magazine/cc301805.aspx,我将检查)?
谢谢(我的第一个问题)
ntdll.dll映射到每个进程,并在代码开始运行之前进行大量基本初始化.这将始终导致分配少量私有内存.看看LdrpInitializeProcess; 这里有一小部分内容:
此外,加载到您的进程中的其他DLL(例如kernel32.dll,user32.dll)可能会在其DllMain函数中自行分配内存.
编辑:看看我创建的这个简单的测试程序:

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