当前位置: 技术问答>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,那么我觉得分页机制可以取消了,线性地址直接映射给物理地址。
当需要使用不在物理内存中的页面时,会产生请求调页,然后操作系统负责内存页的换入换出。
当线性地址转换到物理地址,而物理地址不足4G(比如1G),操作系统可以给你分配内存。
你在线性地址空间得到了需要的内存,而物理内存上通过换页机制也可以满足。
(假如你想使用3G开始的1页地址空间,操作系统会把任意空闲的1页内存给你使用)
要是物理内存有4G,那么我觉得分页机制可以取消了,线性地址直接映射给物理地址。
|
32位的线性地址被分为3段。
[31:22]存放页目录项地址,即存放要寻址的内存在 页目录表 的第几项,页目录表中的每项称为页目录项,也目录项中存放的是页表的地址(指物理地址)
[21:12]存放页表项地址,即内存在 页表 的第几项,页表的每项称为页表项,页表项存放的是该页的物理地址
[11:0]存放页内偏移地址,通过该值就可以在上面所述的页中找到内存
页目录表地址存放在CPU寄存器或某个全局变量中。
虚拟地址到物理地址的转换都是通过MMU来做的,即使物理地址没有4G,虚拟地址依然可以寻址4G的空间。
这其实也是为什么要有内存管理单元(MMU)及虚拟地址的一个重要原因。
不知到这样你理解了没。
如果不理解可以查阅Linux内存管理相关资料。
其实楼主如果有去看《深入理解Linux内核》的话,相信很快就会明白。
[31:22]存放页目录项地址,即存放要寻址的内存在 页目录表 的第几项,页目录表中的每项称为页目录项,也目录项中存放的是页表的地址(指物理地址)
[21:12]存放页表项地址,即内存在 页表 的第几项,页表的每项称为页表项,页表项存放的是该页的物理地址
[11:0]存放页内偏移地址,通过该值就可以在上面所述的页中找到内存
页目录表地址存放在CPU寄存器或某个全局变量中。
虚拟地址到物理地址的转换都是通过MMU来做的,即使物理地址没有4G,虚拟地址依然可以寻址4G的空间。
这其实也是为什么要有内存管理单元(MMU)及虚拟地址的一个重要原因。
不知到这样你理解了没。
如果不理解可以查阅Linux内存管理相关资料。
其实楼主如果有去看《深入理解Linux内核》的话,相信很快就会明白。
|
是这样的,真正意义上的内存只有1G。4G到1G,必须得借用硬盘空间。
一个线性地址对应一个物理地址。
一个物理地址可能对应好几个线性地址。
但是,使用中的那个会被放在内存,不使用的放在硬盘。
由于程序的所谓“局部性”原理,一般这样做不会有问题。
当同时使用内存需求大于1G时,机器就会“很卡”,因为操作系统不断地在换入换出内存页。
希望能够解释清楚 O(∩_∩)O~
|
PS, 在32bit的硬件平台上,有PAE技术,可以扩展超过4GB的物理内存.
|
差不多就是这样了
|
楼主,门槛好高,我想好久才鼓起勇气点击了你的帖子。