关于虚拟地址空间和虚拟内存的问题(求教)

恒水 发布于 2012/10/18 22:57
阅读 1K+
收藏 1

最近遇到一个问题,纠结了好多次,书看了几遍,没有解决,故提问,希望会的人给予帮助,越详细越好,衷心谢谢!

我们知道每个进程有4GB的虚拟地址空间(32位机器下),被分为2部分,一部分是系统空间,一部分是用户空间,那么这个虚拟地址空间存储于什么地方(以前我知道他是不存在的,可是最近又迷糊了,如果是假想的空间,那么说分为2部分,岂不是没有意义,难道仅仅是为了逻辑上让人好理解吗),在os内存管理时,有这么一句话”MMU(内存管理单元)接收cpu发出的虚拟地址,将其翻译为物理地址后发送给内存。内存单元按照该物理地址进行相应访问后读出或写入相关数据“。不理解的是cpu既然发出虚拟地址,那它肯定是知道虚拟地址,它是如何从哪里怎么获取到的?另一个就是内存单元按照物理地址进行相应访问后读出或写入相关数据,内存单元貌似没有这个功能吧?还有就是”如果cpu发出的虚拟地址对应页面不在物理内存,就将产生一个缺页中断,缺页中断服务程序将负责将需要的虚拟页面找到并并加入到内存“,我在想虚拟地址空间是不是就是保存虚拟页面的地址的?它们两者(虚拟地址空间和虚拟内存)之间的关系是如何的呢?望给予指教。

加载中
0
寂寞沙洲
寂寞沙洲

2部分是逻辑上的意思吧 其实不就是一张表么 低位的映射到内核、显卡等硬件 高位给你用的百度 内存 分段 分页


0
中山野鬼
中山野鬼

“一部分是系统空间,一部分是用户空间,那么这个虚拟地址空间存储于什么地方 ? ”

这个话没关系。系统空间和用户空间也可以实实在在的地址。

“不理解的是cpu既然发出虚拟地址,那它肯定是知道虚拟地址,它是如何从哪里怎么获取到的?”

CPU不在乎是否是虚拟地址还是有效地址,既然有MMU,则对应的地址是否合法,由MMU来判断和翻译。翻译成实实在在地址。

“另一个就是内存单元按照物理地址进行相应访问后读出或写入相关数据,内存单元貌似没有这个功能吧?”

如果内存没这个功能,内存有啥功能?

“”如果cpu发出的虚拟地址对应页面不在物理内存,就将产生一个缺页中断,缺页中断服务程序将负责将需要的虚拟页面找到并并加入到内存“,我在想虚拟地址空间是不是就是保存虚拟页面的地址的?”

北京城是不是用来保存中南海毛主席电话号码的?

估计你数字电路没学好。我说几个鬼话概念。

1、38译码器知道吗?这就是最简单的寻址逻辑实现。简单说三根线,每根线可以有高低两个电平,因此组合有8种。如同你去开保险柜,号码是10进制的,那么3个号码,你可以选择到1000个柜子中的一个。

准确说,不是寻址,而是选择。你从1000个柜子中选择到了一个。

而内存,除了片选,就是有几根线用于选择当前哪个内存片子工作外,片子内还有行选,列选。如同电话号码,前面是区号,先锁定你哪个城市,再确认你属于哪个片区。

而 物理地址,由于外部内存连线,包括片内的选择线,和片选线,并不一定连续或从0开始,因此,实际物理地址,是根据连线的情况决定的。每个CPU不都有对应 的总线引脚吗?而且有些空间是分配给“外设”,“内设”,前者如显存,后者诸如一些寄存器。因此,物理地址,通常都是分段用的。每个连续段被不同的“内外 设”所占用,内存其实只是外部设备的一种而已。

而虚拟地址也可以看做逻辑地址。这是为了程序不比考虑实际物理地址的差异性连接,OS就是用于隔离掉硬件的差异性嘛。由此就有个地址转换的问题。你de妈喊你回家吃饭。家就是个虚拟地址。而你家的地理坐标,东经,北纬算是物理地址吧。

2、你和你的梦中情人住一个小区,哪怕你就在她家楼上,你也不能因此就说,实际物理空间上,你就压在她身上。你可以虚拟认为,你就睡在她上面,但现实很残酷,其实你在5楼,她在3楼,4楼还住了风姐她二姨。

3、至于内存切换。毕竟内存匮乏,你兄弟有两个世界。一个是和兄弟看毛片,一个是和美眉看动画片。这属于两个程序。你电脑前就两个椅子,你兄弟和你看完电脑后,他的美眉来了。切换到另一个世界时,咱们的剧本需要女主人公,但并没有坐在你兄弟身边的椅子上。怎么办?一脚把你踹到硬盘里。然后把美眉请出来。这就是缺页中断后,会在你身上发生的故事。为什么会把你踹掉?

是因为一个恐怖的事实,在那个世界里,你兄弟和他的美眉永远靠在一起。

而还有一个更恐怖的事实,在这个世界里,你和你的兄弟,象他和他的美眉一样,也靠在一起。

这两个原因有一个不在,你都不会被踹。


恒水
恒水
回复 @中山野鬼 : 好呗,亲,不是向你确认下呗 - -
中山野鬼
中山野鬼
回复 @恒水 : 你不是把他们已经说清楚了嘛。还有什么问题。。
恒水
恒水
回复 @中山野鬼 恩是的IP(指令指针寄存器),PC(程序计数器)
中山野鬼
中山野鬼
@恒水 你是在说寄存器吗?
恒水
恒水
呵呵,明白了,谢谢野鬼。 那么IP和PC有什么区别呢(书上说两者差不多,既然差不多,何须有IP还有PC呢,还有就是我推测PC中应该存在是虚拟地址吧,当虚拟地址空间中的.text段映射时,会将基地址送到cs中,偏移送到ip中,不知道推测是否正确?)
下一页
0
泡不烂的凉粉
泡不烂的凉粉

楼主概念没搞清楚啊, 虚拟地址, 可以理解成逻辑地址, 由于进程之间是相互隔离的.一个进程死掉不影响另外进程的执行.所以,每个进程都有自己独立的虚拟地址.

虚拟地址当然是跟物理地址是映射关系,物理地址就是实实在在的硬件地址, 为了更好的管理内存, 系统使用线性地址空间. 这个是系统跟进程都共享的先行地址空间.

虚拟地址 分为两部分.为什么? 原因很简单. 虚拟地址是相对于进程来说的.每个进程只懂得自己的虚拟地址空间,但是进程与OS还有其他进程以及各种外部设备,比如显卡,键盘,等等.相互通信. 并且系统里还有共享库的存在,他们都是系统空间, 都是OS参与管理的. 用户进程只有少量权限可以操作这部分内存空间. 另外一部分可以用户进程自由访问.

虚拟地址,是相对于进程而言的.进程只认识虚拟地址. 每个进程都有自己的虚拟地址, 所有进程都有各自的虚拟地址,相互不干扰.虚拟地址分两大部分,一部分是进程自己管理实用的. 另一部分是所有进程都共享的, 被映射近自己的虚拟地址空间里.

虚拟地址跟线性地址是不同的概念, OS在使用的时候 会吧虚拟地址转换到线性地址然后做操作, 线性地址与物理地址是不同的概念. 物理地址是真实的地址空间,比如一个1G内存的机器,物理内存是1G,线性地址可以被分配到4G,32位地址总线. 也可是是 64T, 好像是 46位地址总线,印象不深刻,不一定对. 线性地址是唯一的系统地址, 虚拟地址是每个进程都有自己的虚拟地址, 他们是映射关系, 物理地址是真实的地址, 系统通过对线性地址对物理地址的映射进行管理真实的内存.

恒水
恒水
谢谢。
返回顶部
顶部