虚拟内核和进程地址空间

参考资料:http://www.rxyj.org/articles/42101.html


        32位的CPU的寻址空间是4G,所以虚拟内存的最大值为4G。而windows操作系统把这4G分成2部分,即2G的用户空间和2G的系统空间

  • 系统空间:各个进程所共享的,他存放的是操作系统及一些内核对象等,系统空间是为系统预留的;
  • 用户空间:分配给各个进程使用的,进程的地址空间将映射到这2G的用户空间中,用户空间里面是:程序代码和数据,堆,共享库,栈。
        每个进程都有自己的进程地址空间,而进程地址空间的大小有CPU的位数决定,所以也为4G。


地址空间和内存
        地址空间和内存是不同概念,地址空间是CPU所能管理内存的范围,4GB地址空间不表示4GB物理内存。但4G大小虚拟地址空间的数据肯定会对应4G大小物理内存的数据。按32位Windows来说,虚拟地址空间是4GB,虚拟内存地址的最大值是4GB-1,并不是一开始就有4GB,而是要通过系统来“分配”之后才有的。
        进程地址空间也是4GB,前2GB是用户地址空间,是每个进程独立的;后2GB是系统地址空间,是各个进程共享的。所谓“共享”是指这段空间属于所有进程,而不是不属于某个进程,在内核中同样是要区分进程的。“进程地址空间也是4GB”,“按32位Windows来说,虚拟地址空间是4GB。

进程地址空间也是4GB,前2GB是用户地址空间,是每个进程独立的:
        这句话可以说明进程的用户地址空间是独立的,但没有体现出地址空间的大小。真正的虚拟内存,是由内核管理的内存映射表(系统分配),由多级目录组成,而进程管理的虚表,最终指向内核管理的内存映射表,解释出指向的内存物理区块。(这就可以解释不同的进程,同样的虚址,指向不同的内存)系统空间是为系统预留的(不知道存放的是什么);内核分配的数据,只有内核可直接访问(如,驱动的映射,内核对象表等)。
        虚拟内存与物理内存相对应,虚拟内存映射到硬盘的系统分页文件上,这玩意完全是由操作系统控制的。4GB是32位系统的最大地址编码(以前叫寻址空间),这是由32根地址线决定的,与 CPU的字长无关(字长表示:在同一时间中处理二进制数的位数叫字长。字长与数据总线有关
        理论上,如果物理内存足够大,就不需要使用分页文件(慢),但是事实上不是这样,这可能是由于多任务的特性决定的,我们写的程序运行时的地址其实都是虚拟的(假的进程空间,根据需要分配物理内存或者交换到分页文件),这里说的虚拟与虚拟内存的概念不同,看来大家都认同:
        虚拟内存空间和进程的虚拟地址空间是不同的,而且真正运行时进程的虚拟地址空间会映射到虚拟内存空间。

后2GB是系统地址空间,是各个进程共享
        “所谓“共享”是指这段空间属于每个进程”,是不是每个进程的这部分空间里的东西都是一样的,当切换线程时,虚拟地址空间的前2GB映射会根据所属进程而变化,后2GB映射是不变的。内核分配的数据,只有内核可直接访问(如,驱动的映射,内核对象表等)。
        所用用户进程的2GB-4GB地址空间,都无法被进程自己的用户代码所访问的。“进程实际的用户空间”指的是进程的地址空间,是2GB的。“程序啊,数据什么的都没有那么大”,因此OS只会把这些程序和数据映射到地址空间中,即Reserved和Committed的内存总和,是会小于或远小于2GB的。

进程后2G的空间是在什么时候映射的? 
        应该是在Windows启动的时候,就创建好了一张所有进程共享的系统的页表,每当进程调用系统API陷入内核模式后,访问高端2GB地址时,会去查找系统的那张共享页表,得到实际物理内存地址。

        如果用户程序自己去访问高端2GB地址,因其特权级是Ring3,而高2GB地址需要Ring0特权,因此会报错,访问违例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值