进程的虚拟地址空间

进程的虚拟地址空间

ID:34500477

大小:74.71 KB

页数:26页

时间:2019-03-07

进程的虚拟地址空间_第1页
进程的虚拟地址空间_第2页
进程的虚拟地址空间_第3页
进程的虚拟地址空间_第4页
进程的虚拟地址空间_第5页
资源描述:

《进程的虚拟地址空间》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、进程的虚拟地址空间昨晚看到了深夜,终于对进程的虚拟地址空间有了个大致的了解,很激动,也很欣慰。回头想来,一个程序员,真的应该知道这些知识,否则还真不太称职。首先告诉大家,我后面提到的这些知识在《windows核心编程》中都有,强烈建议大家把这本书翻翻,我相信会对你的编程境界拔高好几个层次的。可是我最近没那么多时间,因此就只能了解个大概,然后等今后闲暇时再看这本书吧。昨天我媳妇还反复和我说:学东西必须要有选择,不能对IT行业的所有知识乱学习,而且不要学那种实际意义不大的知识或是容易被淘汰的知识。其实她说的蛮对的,但是我要说,有关《windows核心

2、编程》里的知识永远都不会过时,因为它侵入到底层和内部了,就像C++,你觉得会过时吗?就像windows永远不会被淘汰一样,呵呵。下面我就来粗略的说说我了解的一些基本知识:32位机器,每个程序有4G的虚拟地址空间。大致分为4块,从低地址到高地址依次是:NULL区,用户区,隔离区,核心区。用户私有的数据都在用户区(当然这个区里又可以细分,其中也包括一部分可以共享的内容),系统内核等东西都在核心区。总体来说,A进程的虚拟地址空间中的内容和B进程相比,只有各自的用户区不一致。通常用户区中,进程又会将exe文件(由头数据和段数据组成)中定义的代码段、堆栈段

3、、数据段等各个段映射到用户区的特定不同部位。对于这部分区域,用户需要用VirtualAlloc先为自己预留后再提交,最后在自己的页面被cpu访问时再从exe映像中将数据加载到主存,然后将虚拟地址映射为主存的物理地址。基本上这样就可以了,至于系统如何进行页面的管理以及地址映射如何实现等细节请大家再参考别的文献。我本以为很复杂呢,结果写出来,就这么一小段,呵呵,看来是高估了自己理解的东西了,呵呵。下面贴出我看的一些资料:虚拟存储器是一个抽象概念,它为每一个进程提供了一个假象,好像每个进程都在独占的使用主存。每个进程看到的存储器都是一致的,称之为虚拟地

4、址空间。每个进程看到得虚拟地址空间有大量准确定义的区(area)构成,每个区都有专门的功能。从最低的地址看起:·程序代码和数据:代码是从同一固定地址开始,紧接着的是和C全局变量相对应的数据区。(应该就是所谓的静态存储空间)·堆:代码和数据区后紧随着的是运行时堆。作为调用malloc和free这样的C标准库函数,堆可以在运行时动态的扩展和收缩。(应该就是所谓的动态存储区)·共享库:在地址空间的中间附近是一块用来存放像C标准库和数学库这样共享库的代码和数据的区域。(C标准库函数的指令,连接阶段把他们加入到编译后的程序)·栈:位于用户虚拟地址空间顶部的

5、是用户栈,编译器用它来实现函数调用。和堆一样每次我们从函数返回时,栈就会收缩。·内核虚拟存储器:内核是操作系统总是驻留在存储器中的部分。地址空间顶部的四分之一部分是为内核预留的。(系统函数?这里说的UNIX系统,不知道windows下是不是这样的?)今天大多数计算机的字长都是32字节,这就限制了虚拟地址空间为4千兆字节(4GB)引言  Windows的内存结构是深入理解Windows操作系统如何运作的最关键之所在,通过对内存结构的认识可清楚地了解诸如进程间数据的共享、对内存进行有效的管理等问题,从而能够在程序设计时使程序以更加有效的方式运行。Wi

6、ndows操作系统对内存的管理可采取多种不同的方式,其中虚拟内存的管理方式可用来管理大型的对象和结构数组。  在Windows系统中,任何一个进程都被赋予其自己的虚拟地址空间,该虚拟地址空间覆盖了一个相当大的范围,对于32位进程,其地址空间为232=4,294,967,296Byte,这使得一个指针可以使用从0x00000000到0xFFFFFFFF的4GB范围之内的任何一个值。虽然每一个32位进程可使用4GB的地址空间,但并不意味着每一个进程实际拥有4GB的物理地址空间,该地址空间仅仅是一个虚拟地址空间,此虚拟地址空间只是内存地址的一个范围。进

7、程实际可以得到的物理内存要远小于其虚拟地址空间。进程的虚拟地址空间是为每个进程所私有的,在进程内运行的线程对内存空间的访问都被限制在调用进程之内,而不能访问属于其他进程的内存空间。这样,在不同的进程中可以使用相同地址的指针来指向属于各自调用进程的内容而不会由此引起混乱。下面分别对虚拟内存的各具体技术进行介绍。地址空间中区域的保留与释放在进程创建之初并被赋予地址空间时,其虚拟地址空间尚未分配,处于空闲状态。这时地址空间内的内存是不能使用的,必须首先通过VirtualAlloc()函数来分配其内的各个区域,对其进行保留。LPVOIDVirtualAl

8、loc( LPVOIDlpAddress, DWORDdwSize, DWORDflAllocationType, DWORDflPro

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。