首页
社区
课程
招聘
[旧帖] [邀请码已发]虚拟地址与虚拟内存个人理解 0.00雪花
发表于: 2011-7-8 12:58 2395

[旧帖] [邀请码已发]虚拟地址与虚拟内存个人理解 0.00雪花

2011-7-8 12:58
2395
学生不才,这个虚拟地址与虚拟内存的问题困惑的我很长的时间,现在写一下最近看过一些资料后的理解吧,肯定存在不完整或者不正确的地方,希望大家可以纠正,如果能给你带来一些新知识,或者帮您复习了一下旧知识,我感到非常荣幸,下面开始,以32位的i386 CPU看。

    首先先来看看我一直以来认识的错误的地方。

    在最开始看书的时候,我知道程序在运行时,不是全部加入内存当中的,当然,这个现在依旧正确,在有了虚拟地址空间这个概念以后,我一直认为是在硬盘中划分出一块虚拟内存出来,然后给每个程序4G的硬盘空间,作为这个程序的虚拟内存,然后就需要运行哪一块然后哪一块装入内存当中。后来发现这个是错误的。大家可以在我错误的地方来看看自己的理解,纠正自己的问题。

    首先,虚拟地址空间是不等于虚拟内存的(我的一本Linux教材上写的是这两个概念一致的,我认为是错误的)。我们来看一下这几个概念:

    虚拟内存:虚拟内存是一种逻辑上扩充物理内存的技术。基本思想是用软、硬件技术把内存与外存这两级存储器当做一级存储器来用。虚拟内存技术的实现利用了自动覆盖和交换技术。简单的说就是将硬盘的一部分作为内存来使用。

    虚拟地址空间:在32位的i386 CPU的地址总线的是32位的,也就是说可以寻找到4G的地址空间。我们的程序被CPU执行,就是在0x00000000到0xFFFFFFFF这一段地址中。高2G的空间为内核空间,由操作系统调用,低2G的空间为用户空间,由用户使用。

    CPU在寻址的时候,是按照虚拟地址来寻址,然后通过MMU(内存管理单元)将虚拟地址转换为物理地址。因为只有程序的一部分加入到内存中,所以会出现所寻找的地址不在内存中的情况(CPU产生缺页异常),如果在内存不足的情况下,就会通过页面调度算法来将内存中的页面置换出来,然后将在外存中的页面加入到内存中,使程序继续正常运行。


   可以看出,虚拟地址空间和虚拟内存的一个关键的因素是MMU(内存管理单元)。

    现在一个程序的执行现在可以分为3部分:

    1:CPU需要执行的语句的虚拟地址。

    2:程序装入内存的部分

    3:程序再外存中的部分

    因为CPU是通过时间片轮转的方法使不同的程序并发执行的。所以在某一时刻只有一个程序占据CPU资源,CPU的最大的寻址空间为4G,所以说可以将每个程序可以看做独立占据4G的内存(只是可以看成,但是它并没有占据实际的4G内存)。而CPU是将虚拟地址空间里面的代码执行,如果在内存中寻找不到所需要的页面,就需要到外存中寻找,外存的这一部分,我们可以当成内存来使用,这也就是虚拟内存。虚拟地址空间不等于虚拟内存。虚拟地址空间是一个空间,不是真正存在的,只是通过CPU的寻址虚拟出来的一个范围。而虚拟内存是实实在在的硬盘的空间。

    我看到了一个比较形象的比喻,假设4G个门牌号(4G的虚拟地址空间,并将这4G的虚拟空间进行分页),但是房子的数量(内存)少于门牌号的数量(4G的虚拟空间),那样就先把每个房子(内存)上挂一个门牌号(页),如果你要找一个门牌号(页),就需要查找每个房子(内存),如果这个门牌号没有挂(页还没有被加入到内存中),那么就将一个房子的门牌号(页面置换到外存)摘下来,把你找的那个门牌号挂上(将外存的页加入内存),这样就找到了需要的门牌号(页)。

    这是我将这个比喻综合了一下。CPU只需要说找哪一个页面,MMU就将这个页面翻译成物理地址,再通过页面调度机制来讲不在内存中的页加入到内存中。

    我认为计算机使用的是一种各司其职的方法。

    CPU老大只需要要虚拟地址中的一页,范围在0x00000000到0xFFFFFFFF,因为他的地址总线是32位,4G是他最大的能力,然后他就把任务分配给他的手下,CPU不需要知道他的手下是如何找到这一页,他只负责去要这一页和执行这些代码,然后他就和他的手下说“有招想去,没招死去”,他的手下必须要能找到这一页,然后内存非常有限,而CPU不管这个,只需要你能找到这一页让我执行就好,所以CPU的手下就将硬盘中的一部分当做内存,然后拿来骗CPU说,“这是我从内存中找到的”,然后CPU就去运行。如果访问的地方实在是不能找到,或者是没有权限,那么这个程序就真死了。程序员在开发的时候,因为程序员所编写的代码最终是要让CPU去执行,所以程序员也理所应当认为我有4G的内存空间,程序员把程序交给CPU,CPU就交给他手下。

    所以说,他们每一层都不需要管对方是如何办到的,他们在乎的只有结果。他们各司其职,CPU认为我有4G内存空间的原因是因为CPU的地址总线为32位,最大的寻址能力是4G,而内存没有这个大,所以它想出来的办法是将硬盘的一部分拿来骗CPU,并给这块骗人的地方起了一个好名字,虚拟内存。这就是我的理解中的虚拟内存空间和虚拟内存的概念。

    自身水平有限,希望大家矫正,谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
2
微机原理啊,谢谢,学习了
2011-7-8 14:17
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
在cpu选择所缺页面时,若实际内存没有4G时,还要涉及到地址空间的扩展,还要和块表的扩展。这时的虚拟地址空间会更复杂。个人觉得 虚拟内存就是以时间换空间。但是虚拟地址原理和机制还是不大透彻。
2011-7-8 15:00
0
雪    币: 53
活跃值: (56)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
谢谢,感觉计算机的知识都是连在一起的,感觉一个问题要牵扯到太多的方面,自己水平还处在起步阶段,还请多多补充!
2011-7-8 15:08
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
下面这篇帖子不错的,最后一张图清楚的描述了保护模式下的分段与分页机制。

INTEL-X86保护模式下的内存管理
http://user.qzone.qq.com/31731705/blog/1307847866
2011-7-8 15:52
0
雪    币: 128
活跃值: (111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢,收藏了
2011-7-11 19:47
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
7
恩,文章还不错,不过问题很多,感觉LZ好多概念没有搞清楚,建议去看一下《Windows内核原理与实现》的第4章,Windows内存管理,讲得很透彻。
2011-7-11 20:34
0
雪    币: 793
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主辛苦了,这个两个概念要讲清楚 就要了解CPU的分段机制和分页机制
2011-7-11 21:18
0
雪    币: 128
活跃值: (111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9


这张图应该有所帮助
上传的附件:
2011-7-11 22:10
0
雪    币: 141
活跃值: (7486)
能力值: ( LV9,RANK:335 )
在线值:
发帖
回帖
粉丝
10
真的强,好文章,说的非常详细
2019-8-3 12:53
0
游客
登录 | 注册 方可回帖
返回
//