当前位置:  技术问答>linux和unix

高手请进:32位虚拟地址经过页机制转换以后得到的物理地址是32位吗?那物理内存又是怎样编址的呢?

    来源: 互联网  发布时间:2017-01-14

    本文导语:  每个进程都拥有4G(2的32次方)的虚拟地址空间。在实际编程过程中,指针中存放的地址也都是32位的线性地址(虚拟地址),经过页目录、页表等分页机制变换以后可以得到真正的物理地址,而这个物理地址也是32位...

每个进程都拥有4G(2的32次方)的虚拟地址空间。在实际编程过程中,指针中存放的地址也都是32位的线性地址(虚拟地址),经过页目录、页表等分页机制变换以后可以得到真正的物理地址,而这个物理地址也是32位的。对于32位的CPU来说没有任何问题,因为它的地址总线是32位的,寻址空间也就是2的32次方(4G)。那么我的问题就出来了:CPU的寻址空间是2的32次方(4G),程序要访问的物理地址(线性地址经过分页机制变换以后得到地址)也是32位的,这种情况下的内存应该至少是4G才对(再次强调:经过页机制转换以后得到的物理地址是32位的),而平时我们自己用的计算机才一两个G(比如说就1个G),那么这时候的内存是怎么编址的呢(1G内存只要30根地址线就够了,相应的的物理地址位数只要30位就行了,用不了32位啊)?还是另一种原因啊:线性地址经过页机制变换以后得到的不是真正的物理地址,这个地址任然是一个虚拟地址?......困惑中......请高手给予解答,万分感激!问题真能够解决的话,分值可以追加的

|

++
就理解为物理地址真正有效的部分只有1G

|

[img=回复zl_Alen: 兄弟,你说的这些我都知道。咱们平时写的程序中变量的地址就是所谓的虚拟地址(线性地址),可以用WinDbg进行调试,就可以把相应的线性地址转换为物理地址。现在是32位的线性地址已经转换成物理地址了,而且这个物理地址也是32位的,这种情况下CPU怎么寻址1G的内存空间呢?][/img]

楼主,首先我不明白你所说的物理地址也是32位之说。
既然你都知道了MMU功能,是一个基于表查询机制的,那何来的32位物理地址,或者说这个32位物理地址只是页表或者页框在内存中的位置(如果是这样的话倒是说得通,页目录项和页表项都是32位的物理地址)?

假如我的系统中只有128M内存,页目录项中存放的只是页表在内存中的位置(肯定在128M范围内,如果不再,页目录项对应的标志,没记错的话是有个是否在内存的标志会被置位,这个时候会发生缺页异常)
而页表项中存放的的是页框在内存中的位置(这个也应该在128M范围内,否则同理会出现缺页异常)
而虚拟地址中低12位就是在页框中的偏移量了。

如果发生缺页异常(比如页表或者页框没在128M内存范围内),异常处理程序会寻找一个空闲页(如果内存不够用,还会发送磁盘交换操作),再将该页的地址(这个地址是物理地址)赋值给页目录项或者页表项。

不知道这样楼主是否理解。

|
线性地址空间与物理地址空间大小不一致,这才导致产生了分页机制。

当需要使用不在物理内存中的页面时,会产生请求调页,然后操作系统负责内存页的换入换出。

当线性地址转换到物理地址,而物理地址不足4G(比如1G),操作系统可以给你分配内存。
你在线性地址空间得到了需要的内存,而物理内存上通过换页机制也可以满足。
(假如你想使用3G开始的1页地址空间,操作系统会把任意空闲的1页内存给你使用)

要是物理内存有4G,那么我觉得分页机制可以取消了,线性地址直接映射给物理地址。



|
32位的线性地址被分为3段。
    [31:22]存放页目录项地址,即存放要寻址的内存在 页目录表 的第几项,页目录表中的每项称为页目录项,也目录项中存放的是页表的地址(指物理地址)  
    [21:12]存放页表项地址,即内存在 页表 的第几项,页表的每项称为页表项,页表项存放的是该页的物理地址
    [11:0]存放页内偏移地址,通过该值就可以在上面所述的页中找到内存

页目录表地址存放在CPU寄存器或某个全局变量中。

虚拟地址到物理地址的转换都是通过MMU来做的,即使物理地址没有4G,虚拟地址依然可以寻址4G的空间。
这其实也是为什么要有内存管理单元(MMU)及虚拟地址的一个重要原因。

不知到这样你理解了没。

如果不理解可以查阅Linux内存管理相关资料。

其实楼主如果有去看《深入理解Linux内核》的话,相信很快就会明白。

|


是这样的,真正意义上的内存只有1G。4G到1G,必须得借用硬盘空间。
一个线性地址对应一个物理地址。
一个物理地址可能对应好几个线性地址。
但是,使用中的那个会被放在内存,不使用的放在硬盘。

由于程序的所谓“局部性”原理,一般这样做不会有问题。
当同时使用内存需求大于1G时,机器就会“很卡”,因为操作系统不断地在换入换出内存页。

希望能够解释清楚 O(∩_∩)O~

|
本帖最后由 wenxy1 于 2011-11-07 11:19:40 编辑
理解虚拟地址,物理地址,逻辑地下和虚拟内存(放在硬件上的文件),内存页交换机制即可.
PS, 在32bit的硬件平台上,有PAE技术,可以扩展超过4GB的物理内存.

|


差不多就是这样了

|
楼主,门槛好高,我想好久才鼓起勇气点击了你的帖子。

    
 
 

您可能感兴趣的文章:

  • 逻辑地址、物理地址、线性空间、全局段、局部段 问题请教,高手指教了!!!!在线等,高手指教了!!!在线等!!!!!!!!
  • 高手来,网卡真实地址
  • <请教如何把IP地址转为主机名,焦急等待中...请高手帮忙>
  • LINUX的初学者,请高手推荐一个适合的版本,最好有下载地址,先谢了~!!
  • 请shell编程高手指教:如何查找文件中的ip地址
  • 请问高手,有没有办法可以控制文件的下载?下载文件,一般通过地址链直接链接过去就可以下载,但有些文件是要某种条件下才可以让客户下载,如
  • 将域名转换为IP地址的小程序,整个程序运行完毕后出现段错误,请高手看看
  • 关于linux shmat 地址奇怪问题,请熟悉共享内存的高手指点一下
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 有高手研究Agent++麽?里面有个thread.h,蛮难读的,请高手指点
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由
  • 高手救命,很急——ORACLE817安装在UNIXWARE711上,手工启动数据库后在netasst中连接错误,高手帮我看看?
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 各个高手看看这个问题!本人第一次学习java所以要各位高手的帮助。。
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • NOSQL iis7站长之家
  • EJB问题,请教高手(非高手莫进)
  • 请各位JAVA高手,网业高手看过来,我把能给的分都送出!!!只能给37分,哎!!
  • eWEEK沙龙征集高手座谈


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3