首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

阅览windows核心编程 对进程地址空间的困惑

2013-07-09 
阅读windows核心编程 对进程地址空间的困惑阅读windows核心编程 对进程地址空间的困惑13.3 地址空间中的区

阅读windows核心编程 对进程地址空间的困惑
阅读windows核心编程 对进程地址空间的困惑

13.3 地址空间中的区域
当系统创建一个进程并赋予它地址空间,可用地址空间中的大部分都是闲置的或尚未分配的。为了使用这部分地址空间,我们必须调用virtualalloc来分配其中区域。分配区域的操作被称为预定

当应用程序预定地址空间区域的时候,系统会确保区域的其实地址正好是分配粒度的整数倍。也就是64k的整数倍。。。

13.4 给区域调拨物理存储器
为了使用预定的地址空间区域,我们还必须分配物理存储器,并将存储器映射到所预定的区域。这个过程叫调拨物理存储器。。。。
--------------------------------------
问题:

上文所指的 “系统创建一个进程并赋予它地址空间” 是指逻辑性的地址空间还是物理性的地址空间,如果是逻辑性地址空间,对于32位系统应该为4G,既然每个进程都是4g干嘛还说“可用地址空间中的大部分是限制的或尚未分配”,4g不是每个进程都有,不都分好了吗

另外:赋予地址空间,分配地址空间 这两个具体的动作感觉特别抽象,能不能具体解释下 vc Windows 编程 内存管理 地址映射
[解决办法]
4G应该是最多分配的内存空间吧
为啥是4G呢,因为的指针是4个字节的,而4个字节的范围是0---2的32次减1,算一下刚刚好是4G
系统想给你分个5G,都不行了,这些原理说出来很简单,关键是多思考多想,书上好像很少有这么解释的吧
[解决办法]
每个进程是4G,但是你的程序并没有4G那么大。
所有的加载的dll等,都被映射到地址空间里面,要用到的时候,就会去找对应的起始地址
[解决办法]
段基址+偏移量--》(段映射)--》线性空间--》页映射--》(物理空间)

给进程分配的是线性空间,需要为进程准备好页表和页目录表。

调配物理空间是在页映射时进行的,调配过程分布于整个进程运行期间。
[解决办法]
逻辑地址。。
[解决办法]
其实就是一般虚拟地址模式申请内存需要两步reserve和commit。分别对应的是建立页索引和标记页可用。其中建立页索引的步骤就是申请虚拟地址空间,也就是为你打算要用的虚拟地址空间的页建立索引。

reserve这个步骤某种意义上是可以没有的,但存在一个问题就是4GB(实际上32位Windows上进程的可用地址空间默认是2GB,另外2GB是所有进程共享的Ring0空间。64位系统上的32位进程才会有完整的4GB空间)内存的索引也还是十分巨大的。所以进程刚建立的时候不会直接建立4GB的索引,需要让进程自己在需要的时候建立。
[解决办法]
4G是CPU的寻址上限或者操作系统允许的寻址上限。
reserve是为系统给程序分配地址空间留下一个缓冲,一遍更快的分配地址空间,并且节约系统实际使用的地址空间,因为WINDOWS 开发出来时,不论是内存还是,硬盘实际空间都很小。
4G空间,在当时是个很大的负担。

[解决办法]
VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

理解、讨论之前不妨先观察

热点排行