系统加载进程,为什么不直接加载到物理内存,而非要先弄到虚拟地址空间

谁学逆向工程 2012-02-15 11:46:06
下面这段话来自《windows核心编程》第五版,85页,4.2节第一段

一个线程调用 CreateProcess 时,系统将创建一个进程内核对象,其初始使用计数为1.进程内核对象不是进程本身,而是操作系统用来管理这个进程的一个小型数据结构 ---- 可以把进程内核对象想象成由进程统计信息构成的小型数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行文件(和所有必要的DLL)的代码及数据加载到进程的地址空间。
...全文
259 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2012-02-15
  • 打赏
  • 举报
回复
加入你的程序需要一个很大的连续空间,诸如开辟一个很大的数组。
而此时物理内存已经没有这么大的连续空间,那怎么办呢。
onlycs 2012-02-15
  • 打赏
  • 举报
回复
为了更好的利用资源吧。减少对物理内存的使用,再者大程序几个G的,直接加载,恐怕物理内存都不够。
百事烟 2012-02-15
  • 打赏
  • 举报
回复
节省内存,减少加载时间

如果执行文件A.exe,一开始,并不是把A.exe读入内存,而是把A.exe所在磁盘的头地址映射为内存地址,
这样做的好处是加载的过程没有任何读数据的操作,只是做了一个内存映射
gameslq 2012-02-15
  • 打赏
  • 举报
回复
物理内存“太小了”
看看操作系统内存管理部分就明白了
x86架构的机器内存管理分为实模式和保护模式
在实模式下程序直接加载到物理内存,但保护模式则需要地址转换
虚拟地址(线性地址)到物理地址的转换,所以每个进程的地址空间都是
线性的,虚拟的。
Lactoferrin 2012-02-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fly4free 的回复:]
我的理解:

这个 “虚拟地址空间”,应该是对程序员说的。
此时,它有可能在物理内存中,有可能在换页文件中,这些是用到的地址空间的数据。
至于没用到的地址空间,哪里也不在,还没分配呢。

只是在内存管理相关数据结构中(或者就在进程对象里?)记录了该进程的 虚拟地址空间范围。
然后用另一些结构体记录 虚拟地址空间使用情况,对于程序员,就是 内存使用情况。

而和物理内存之间的关系,……
[/Quote]
fly4free 2012-02-15
  • 打赏
  • 举报
回复
我的理解:

这个 “虚拟地址空间”,应该是对程序员说的。
此时,它有可能在物理内存中,有可能在换页文件中,这些是用到的地址空间的数据。
至于没用到的地址空间,哪里也不在,还没分配呢。

只是在内存管理相关数据结构中(或者就在进程对象里?)记录了该进程的 虚拟地址空间范围。
然后用另一些结构体记录 虚拟地址空间使用情况,对于程序员,就是 内存使用情况。

而和物理内存之间的关系,可能就是内存管理核心的事情了。

我没法验证,不知道正确与否。
quwei197874 2012-02-15
  • 打赏
  • 举报
回复
物理内存小啊

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧