菜鸟笔记
提升您的技术认知

x86架构下,页面大小为什么是4K?

前提:32位逻辑空间的计算机OS,两级页表,每个页中每个条目占4bytes,即32位的数据
以上前提是目前X86架构的32为系统的真实情况;

设页大小为X(byte),则X/4为每个页可以存取的条目的个数,两级页表的地址转换关系如下图所示:

假设在一个32位的条目中存放此内存的地址,则2*log2(X/4)就是图1中,p1+p2的位数;

2^(p1 + p2):系统可以寻址多少个页面
(X / 4)^2:前两级页表共可以选择多少entry,因为第一级页表entry个数为4,第二级相同;

系统可以寻址的页面数目 = 前两级页表共可以选择多少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)不行?不是不行,是这么做就是傻x,为什么?解释如下:

前提如上面所述,如果页面大小是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,目前ARM v8 64位的Linux中,大内存情况下2M是比较合理的,而且OS中对其支持的很完美;