x86架构上Linux内核的默认内存页面大小是4 KB,我想知道这是如何计算的,为什么?
答案 0 :(得分:31)
默认页面大小由CPU支持的MMU(内存管理单元)固定。在32位保护模式下,x86支持两种页面:
并非所有x86处理器都支持大页面。需要具有页面大小扩展(PSE)功能的CPU。这不包括奔腾前处理器。实际上,所有当前的x86 CPU都实现了它。
4 KiB在其他架构中也是广泛的popuplar页面粒度。有人可能会争辩说,这个大小来自于将32位虚拟地址划分为页目录/表中的两个10位索引,剩下的12位表示4 KiB页面大小。
答案 1 :(得分:21)
32位架构的4KB普通页面大小的设计实际上非常有趣:)
我想补充一个额外的答案,以证明其合理性。
x86使用 2级页面表'将虚拟内存地址转换为物理内存地址。
假设页面目录和页面表都包含个条目,页面大小为个字节。为了充分利用地址,我们有:
页面目录/表中的每个条目消耗4个字节(32位),因此:
因此y = 12,页面大小以字节为单位 = = 4KB。
' 1级页面表&#39 ;?这很有趣,因为从逻辑上讲,我们可以使用单个页面表进行地址查找。
假设页面目录包含个条目,每个条目都将地址映射到相应的页面,页面大小为个字节。
同样,为了充分利用地址,我们需要:
和
我们得到y = 17,页面大小为 = = 128KB。
我们也可能会争辩说,在' 2级页面表中'版本,页面目录和页面表可能具有不同的大小。但是,这意味着我们将使用更大的页面目录,这将占用多个内存页面。遗憾的是,每次生成新的用户进程时,对于自己的页面目录,操作系统必须分配连续的页面,这在设计上并不优雅。
答案 2 :(得分:12)
That depends on the processor architecture
许多体系结构的默认页面大小为4 KB。通常可以通过切换到huge page模式来增加(有时很多,例如AMD64的1 GB)。这允许页表更小,这可以提高性能。
答案 3 :(得分:1)
答案 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中的那些大页面怎么样?"?