You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算二级页表大小?含一/二级页表及最值计算需求

解答:二级页表大小及极值计算

Alright, let's walk through this step by step, since you already have some key pieces sorted out. First, let's recap all the given info to make sure we're on the same page:

  • 32位虚拟地址空间
  • 页大小:4KiB(因此页偏移为12位,因为2^12 = 4096)
  • 页表项(PTE)大小:4B
  • 进程使用1GiB虚拟地址空间
  • 页目录(一级页表)包含1024项

地址拆分逻辑

页偏移占用12位,因此剩余32-12=20位用于页号。页目录有1024项(2^10),所以页号的前10位用来索引页目录,剩下的20-10=10位则用于索引二级页表。

单个二级页表的大小

每个二级页表可以容纳2^10=1024个页表项(因为我们有10位索引位)。每个页表项是4B,因此单个二级页表的大小为:
1024 * 4B = 4096B = 4KiB
刚好等于一个页面的大小,所以每个二级页表可以完美适配到一个物理页中。

二级页表总大小(进程使用1GiB地址空间)

首先计算进程使用的总页数:
1GiB / 4KiB = 2^30 / 2^12 = 2^18 = 262144页

每个二级页表可以管理1024个页面(因为它有1024个页表项),因此需要的二级页表数量为:
262144 / 1024 = 256

乘以单个二级页表的大小,得到总大小:
256 * 4KiB = 1024KiB = 1MiB
这就是该进程所有二级页表的总大小。

二级页表的最大与最小总大小

我们根据进程虚拟页面的分布情况来分析:

  • 最小总大小:如果进程的1GiB虚拟地址空间是连续的(这是常见情况),它会恰好覆盖256个连续的二级页表(每个覆盖4MiB虚拟地址空间)。即使进程没有使用这个1GiB范围内的每一个页面,每个必需的二级页表仍然需要占用完整的4KiB物理页(因为页表是以整页为单位分配的)。因此最小总大小仍然是1MiB。
  • 最大总大小:极端情况下,进程的已用页面在1GiB地址空间内尽可能分散——每个已用页面都位于不同的二级页表索引中。但要注意,1GiB地址空间被限制在256个唯一的二级页表索引内,即使每个已用页面都对应不同的索引,我们仍然只需要256个二级页表。因此最大总大小同样是1MiB。

如果是进程使用1GiB物理内存但可访问完整4GiB虚拟地址空间的场景,最坏情况是每个页面都映射到不同的二级页表,总大小会达到262144*4KiB=1GiB,但本题明确进程使用的是1GiB地址空间,所以这种极端情况不适用。

关于你提到的4.2MB一级页表

快速说明:包含1024项的页目录(一级页表)大小应该是1024*4B=4KiB,而非4.2MB。这可能是混淆了一级页表与所有二级页表加目录的总大小,但即使后者也仅约1MiB+4KiB≈1.004MiB。4.2MB的数值大概率是计算失误,但上述二级页表的推导逻辑是成立的。

内容的提问来源于stack exchange,提问作者Marcin Barański

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:30:55