前提:32位逻辑地址空间的计算机系统,三级页表,每个页中每个条目占4Byte,即32位的数据
以上前提是目前x86架构32位系统的真实情况
设:页大小为X(byte)
则:X/4就是每个页中可以存取的条目个数
两级页表的地址转化关系如图1所示:
图1:
假设在一个32位的条目中存放此内存的地址,则2*log2(X/4)就是图1中,p1+p2的位数。
2^(p1+p2):系统可以寻址多少个页面
(x/4)^2:前两级页表共可以选择多少个entry,因为第一级页表entry个数是x/4,第二级相同,所以相乘既共有多少个entry
系统可以寻址的页面数目=前两级页表共可以选择多少个entry,即2^(p1+p2)=(x/4)^2====>2*log2(X/4)=p1+p2。
此外:如果页大小为X,那么为了偏移量能够寻址所有的X位,需要:2的d次方=X,即log2(X)=d。
然而由图一知,p1+p2+d=32,所以:
2*log2(X/4)+log2(X)=32
可以计算得到X=4096.即页的大小为4096bit=4k。
以上只是硬件在最充分利用资源情况下的方式,有人说为什么其他大小的页面(如8k)不行?不是不行,是这么做性能无法最优,为什么?解释如下:
前提如上面所述,如果页面大小是8k,d就必须等于13(2^13=8k),p1+p2=19;
此时每个entry还是4B,则每个页面共有entry=8K/4B=2048个;
假设用p2寻址2048个entry,则p2=11,此时p1=8;
问题来了,p1=8,则第一级页表只能寻址2^8=256个entry,此时第一级页表就有2048-256=1792个entry不能使用,这是多大的资源浪费???!!!
当然,系统其他地方的开销是需要平衡的,所以4k是一个综合评价后的结果。
但是,以后的大型系统,内存很可能上升到T级别,到那时在用4k页就是傻X。目前ARMv8 64位的Linux中,大内存情况下2M页是比较合理的,而且OS中对其支持很完美。
转载请注明出处:http://blog.csdn.net/qianlong4526888/article/details/7697336