首页
社区
课程
招聘
[求助]exe运行时,整个文件都加载到内存里吗?
发表于: 2009-7-21 09:47 7636

[求助]exe运行时,整个文件都加载到内存里吗?

2009-7-21 09:47
7636
收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
有个别区段会被丢弃,比如重定位段
2009-7-21 09:57
0
雪    币: 97
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
开始只是对文件中的代码段、数据段等(不是所有区段)建立内存映射,并且只将工作集加载到内存里(建立物理内存映射),就开始运行了,没有被加载到内存的地址被访问时会自动加载(缺页处理)。
2009-7-21 14:45
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
刚才碰巧查到这些东西:
一.执行程序
    当创建一个线程时,
    1.系统只是保留了足够大的对应的.exe文件区域,将.exe文件本身作为物理内存,执行映射,却并未提交;
    2.访问.exe文件的部分区域,以确定依赖的.dll(这将导致部分页面被提交);
    3.依次LoadLirary(像为.exe保留区域一样,也为.dll保留区域,并有些类似第4步);
    4.执行.exe的启动代码,并持续执行(执行到哪就提交哪块).

二.程序运行时修改全局变量或自修改代码
    同一个程序可能运行多个实例,而每个进程都把原始文件当作物理内存看待,那么其中一个进程修改了某部分数据或代码,其他进程是否也被改动了呢?答案是否定的。由于Copy-On-Write的干预,每当一个进程试图修改全局变量(或代码)时,都会把这个变量所在的页重新拷贝一份,并把虚拟地址映射到这个拷贝上,此时怎么改都只是改动单独为此进程准备的副本,而不会影响其他进程。

但我还有个地方不明白:
在加载资源的时候为什么在LoadResource后还要LockResource?如果是都在内存映射文件里的话,LockResource是不是就没有必要调用了?
2009-7-21 15:20
0
雪    币: 97
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
The return type of LoadResource is HGLOBAL for backward compatibility, not because the function returns a handle to a global memory block. Do not pass this handle to the GlobalLock or GlobalFree function. To obtain a pointer to the resource data, call the \Program%20Files\Microsoft%20Visual%20Studio\MSDN\2001JUL\1033\winui.chm::/hh/winui/resource_4co5.htm" target="_blank">LockResource function.
2009-7-21 15:29
0
雪    币: 558
活跃值: (43)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
6
除了某些区段,文件的附加数据也是不被加载到内存的
2009-7-21 15:54
0
游客
登录 | 注册 方可回帖
返回
//