为什么Linux(x86)的页面大小为4 KB,如何计算?

时间:2012-07-18 14:30:29

标签: linux x86 kernel cpu-architecture

x86架构上Linux内核的默认内存页面大小是4 KB,我想知道这是如何计算的,为什么?

5 个答案:

答案 0 :(得分:31)

默认页面大小由CPU支持的MMU(内存管理单元)固定。在32位保护模式下,x86支持两种页面:

  • 正常的,4 KiB
  • 巨大的,4 MiB

并非所有x86处理器都支持大页面。需要具有页面大小扩展(PSE)功能的CPU。这不包括奔腾前处理器。实际上,所有当前的x86 CPU都实现了它。

4 KiB在其他架构中也是广泛的popuplar页面粒度。有人可能会争辩说,这个大小来自于将32位虚拟地址划分为页目录/表中的两个10位索引,剩下的12位表示4 KiB页面大小。

答案 1 :(得分:21)

32位架构的4KB普通页面大小的设计实际上非常有趣:)

我想补充一个额外的答案,以证明其合理性。

x86使用 2级页面表'将虚拟内存地址转换为物理内存地址。

假设页面目录和页面表都包含enter image description here个条目,页面大小为enter image description here个字节。为了充分利用enter image description here地址,我们有:

enter image description here

页面目录/表中的每个条目消耗4个字节(32位),因此:

enter image description here

因此y = 12,页面大小以字节为单位enter image description here = enter image description here = 4KB。


' 1级页面表&#39 ;?这很有趣,因为从逻辑上讲,我们可以使用单个页面表进行地址查找。

假设页面目录包含enter image description here个条目,每个条目都将地址映射到相应的页面,页面大小为enter image description here个字节。

同样,为了充分利用enter image description here地址,我们需要:

enter image description here

enter image description here

我们得到y = 17,页面大小为enter image description here = enter image description here = 128KB。


我们也可能会争辩说,在' 2级页面表中'版本,页面目录和页面表可能具有不同的大小。但是,这意味着我们将使用更大的页面目录,这将占用多个内存页面。遗憾的是,每次生成新的用户进程时,对于自己的页面目录,操作系统必须分配连续的页面,这在设计上并不优雅。

答案 2 :(得分:12)

That depends on the processor architecture

许多体系结构的默认页面大小为4 KB。通常可以通过切换到huge page模式来增加(有时很多,例如AMD64的1 GB)。这允许页表更小,这可以提高性能。

答案 3 :(得分:1)

我从维基百科的文章中得到了这个,我引用了:

  

页面大小通常由处理器架构确定

查看以下文章:

http://en.wikipedia.org/wiki/Page_(computer_memory)

答案 4 :(得分:0)

我添加这个答案/评论,因为sleepsort的计算非常有趣,我必须将它添加到我的网页(当然提到来源)。 可以找到({可能)回答问题如何以编程方式计算页面大小的问题here。 sleepsort提到的计算方式非常有趣。我为x86_64做了同样的事情,结果不是我的预期。然而,在memory management x86_64上进一步阅读我发现,对于64位英特尔,不使用16位,留下48位供我们计算。 9位用于内存树分支, 每个分支另外9位, 这里又有9个分支机构 最后9分为最后一个分支的叶子。因此,对于存储器页面中的每个地址,48-36 = 12位。 2 ^ 12 = 4096就像之前提到的sleepsort一样。 我只是想知道这个架构有多少通过,3或4(如果有人可以解释的话) 按照sleepsort的计算:

2^x * 2^x * 2^x * 2^x * 2^y = 2^48
4x + y = 48

this time we have 8 bytes for each address (8 bytes * 8 bits / byte = 64 bits)

2^y / 2^3 = 2^x
y - 3 = x
filled in in previous equation:

4(y - 3) + y = 48
4y - 12 + y = 48
5y = 60
y = 12
because 2^y represents the pagesize, the size = 2^12 = 4096 bytes

给我留下问题" Linux中的那些大页面怎么样?"?