日期:2014-05-16  浏览次数:20701 次

高手请进: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位物理地址的高两……