MyException - 我的异常网
当前位置:我的异常网» Linux/Unix » :32位虚拟地址经过页机制转换以后得到的物理地址是

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

www.MyException.Cn  网友分享于:2013-02-29  浏览:16次
高手请进: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位啊)?还是另一种原因啊:线性地址经过页机制变换以后得到的不是真正的物理地址,这个地址任然是一个虚拟地址?......困惑中......请高手给予解答,万分感激!问题真能够解决的话,分值可以追加的

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

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

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

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



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

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

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

不知到这样你理解了没。

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

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

------解决方案--------------------
探讨

回复renq_654321:
“物理地址不足4G(比如1G),操作系统可以给你分配内存”。怎么分配?借用硬盘的空间吗,还是从硬盘换页到内存?这不又是虚拟存储器了吗? 关键问题是:线性地址经过页机制转换以后得到的那个32位地址是不是物理地址?是的话,1G内存不够用,您说操作系统给分配,怎么分配呢?内存又怎样编址呢? 请再解释清楚一点,谢了!

------解决方案--------------------
探讨

引用:

回复renq_654321:
“物理地址不足4G(比如1G),操作系统可以给你分配内存”。怎么分配?借用硬盘的空间吗,还是从硬盘换页到内存?这不又是虚拟存储器了吗? 关键问题是:线性地址经过页机制转换以后得到的那个32位地址是不是物理地址?是的话,1G内存不够用,您说操作系统给分配,怎么分配呢?内存又怎样编址呢? 请再解释清楚一……

------解决方案--------------------
楼主,门槛好高,我想好久才鼓起勇气点击了你的帖子。
------解决方案--------------------



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

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

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

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

------解决方案--------------------
理解虚拟地址,物理地址,逻辑地下和虚拟内存(放在硬件上的文件),内存页交换机制即可.
PS, 在32bit的硬件平台上,有PAE技术,可以扩展超过4GB的物理内存.
------解决方案--------------------
探讨

回复delphiwcdj:

昨天晚上想了一晚上觉都没睡好。今天早上醒来的时候突然发现自己在思考这个问题的过程中漏了一个小环节:正是六楼的前辈所提到的“物理地址真正有效部分”的问题。下面是我的个人理解:
32位处理器,有32根地址总线,相应的物理地址就有32位,可以寻址的内存空间就是4G;假如内存只有1个G的话,只需30位物理地址即可,那么这个时候理论上32位物理地址的高两……

文章评论

看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员和编码员之间的区别
程序员和编码员之间的区别
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
编程语言是女人
编程语言是女人
为什么程序员都是夜猫子
为什么程序员都是夜猫子
Java程序员必看电影
Java程序员必看电影
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
老程序员的下场
老程序员的下场
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
旅行,写作,编程
旅行,写作,编程
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
10个调试和排错的小建议
10个调试和排错的小建议
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
我的丈夫是个程序员
我的丈夫是个程序员
代码女神横空出世
代码女神横空出世
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
每天工作4小时的程序员
每天工作4小时的程序员
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
鲜为人知的编程真相
鲜为人知的编程真相
如何成为一名黑客
如何成为一名黑客
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员应该关注的一些事儿
程序员应该关注的一些事儿
漫画:程序员的工作
漫画:程序员的工作
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
 程序员的样子
程序员的样子
我是如何打败拖延症的
我是如何打败拖延症的
一个程序员的时间管理
一个程序员的时间管理
那些争议最大的编程观点
那些争议最大的编程观点
中美印日四国程序员比较
中美印日四国程序员比较
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员都该阅读的书
程序员都该阅读的书
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序员的鄙视链
程序员的鄙视链
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有