为什么使用分层页表?

Det*_*ant 19 paging linux-kernel

我正在学习Linux内核并阅读"Linux内核 "一书.

任何人都可以解释为什么我们不能只使用直接映射逻辑和物理内存而不是树状多层结构的表?

添加:

所需的条目总数是固定的,所以我认为存储复杂结构而不是简单结构浪费的空间更多.

Pav*_*ath 33

当我们进入64位地址空间时,您将欣赏多级页表的空间优化.

假设您有一台64位计算机(这意味着64位虚拟地址空间),它具有4KB页面4 GB物理内存.如果我们建议使用单级页表,则每个进程每个虚拟页应包含一个条目.

每个虚拟页面一个条目 - 每个页面2 个64个可寻址字节/ 2 个12个字节= 2个52个页面表项

一个页表条目包含:访问控制位(如页面存在的位,RW等)+物理页面编号

4 GB物理内存= 2 32个字节.

2 32字节内存/ 每页2 12字节= 2 20个物理页面

物理页码需要20位.

因此每个页表条目大约是4个字节.(20位物理页面编号大约3个字节,访问控制贡献1个字节)

现在,Page表大小= 2 52页表项*4字节= 2 54字节(16 petabytes)!

每个进程16 PB是非常大量的内存.

现在,如果我们也分页页面表,即如果我们使用多级页表,我们可以神奇地将所需的内存降低到单页.即仅4 KB.

现在,我们将计算将页表压缩到4 KB所需的级别.4 KB页/每页4个字节表条目= 1024个条目.需要10位地址空间.52/10 ceiled是6.即6级页面表可以将页表大小降低到只有4KB.

6级访问肯定更慢.但我想说明多级页表的节省空间.

  • 我认为,如果程序实际上使用了所有 2^64 虚拟地址空间,那么使用多级分页并不能节省页表使用的潜在大量内存空间。相反,它消除了预先连续分配巨大页表的需要,并且还允许在需要时延迟创建映射的可能性。 (2认同)