+ -
当前位置:首页 → 问答吧 → 关于内存映射一段话求解

关于内存映射一段话求解

时间:2011-01-11

来源:互联网

以下是网上的一段.exe文件加载过程:
ü 加载过程 

1. 系统根据exe文件名建立进程内核对象、页目和页表,也就是建立了进程的虚拟空间。 

2. 读取exe文件的大小,在默认基地址0x0040 0000上保留适当大小的区域。可以在链接程序时用/BASE 选项更改基地址(在VC工程属性\链接器\高级上设置)。提交时,操作系统会管理页目和页表,将硬盘上的文件映射到进程空间中,页表中保存的地址是exe文件的页偏移。 

3. 读取exe文件的.idata节,此节列出exe所用到的所有dll文件。然后和 

exe文件一样,将dll文件映射到进程空间中。如果无法映射到基地址,系统会重新定位。 

4. 映射成功后,系统会把第一页代码加载到内存,然后更新页目和页 

表。将第一条指令的地址交给线程指令指针。当系统执行时,发现代码没有在内存中,会将exe文件中的代码加载到内存中。 
------------------------------------------------------------------------------------------------------------
我要问的是,在第二步骤中所说的“将硬盘上的文件映射到进程空间中”是不是将硬盘文件映射到线性地址上啊?线性地址再映射成物理地址?
还有第四个步骤的疑问就是:在第二步骤中已经映射了硬盘上的文件为什么在第四步骤中还要将exe文件中的代码加载到内存中呢?硬盘上的文件指的是什么。。

作者: yg29hxj   发布时间: 2011-01-11

第二步是映射为线性地址,如果没有启用分页,线性地址就是物理地址,如果
启用分页,还需要映射为物理地址。

程序代码和数据是按需加载,一般不会全部加载到内存.

作者: dengzikun   发布时间: 2011-01-11

我的理解是这样的。你说的第二步只是将EXE在文件系统中的页映射进了进程空间中的页表中。此时只是映射。数据和代码没有真正写到物理内存中。
第四步的时候,才真正将要使用的代码和数据写入物理内存。这时,程序才能正确运行。

作者: ydfivy   发布时间: 2011-01-11