【问题标题】:Understanding page directories了解页面目录
【发布时间】:2017-11-15 15:11:47
【问题描述】:

我阅读了一些关于页目录和页表的手册,但对这些概念仍然很困惑。例如here 我发现只进行单级分页是在浪费内存。所以在x86架构中我们使用了2级分页。

cr3 --> PageDirectory --> PageTable --> Page

所以考虑下面的线性地址。

01001010101 1010101101 10101110101010 
 page tbl     page      offset

使用page tbl 位我们找到页目录条目的物理地址。 PD = cr3 + L * (page tbl) 包含页表物理地址PT。现在我们正在寻找我们的页面P = PT + L * page。所以在单层中,我们有一个 4MiB 的页表。现在我们总共有 1024 个页表 4KiB = 4MiB。看不到内存经济。

我错过了什么?

【问题讨论】:

  • 每个进程 4MB 的连续物理内存实际上是相当多的。我的 Linux 桌面现在有 151 个用户空间进程正在运行(仍将多线程进程计为 1)。 (我排除了内核进程,因为它们没有自己的页表)。那将是 604MiB 仅用于页表。
  • @PeterCordes 是的,有点……但无论如何,如果我们分配了所有 1024 个页表,我们将在页表上花费相同的 4MiB 内存。问题不是所有这 1024 个页表都已分配,对吗?
  • 是的,完全正确。我的评论仅与@Fuz 的回答一起有意义:大多数进程的内存映射非常稀疏,尤其是在 64 位系统中。

标签: assembly memory-management x86 paging


【解决方案1】:

通常,页表远未满。对于平面页表,如果只需要前几个和最后几个条目,仍然需要分配整个表。使用页目录,除了第一个和最后一个页表之外的所有页表都可以省略,从而节省大量内存。在当今拥有大量 RAM 的时代,收益似乎很小,但当计算机总共可能只有 4 MiB 的 RAM 时,收益确实很大。

【讨论】:

  • 听起来很合理。我可以问你一些澄清。正如这里所指定的here 我们在页面目录中仅使用 20 位。我是 4KiB 对齐的原因吗?为了代表所有可用地址?
  • @St.Antario 没错。仅使用页表地址的高 20 位,低 12 位用于簿记。
猜你喜欢
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2018-01-24
  • 2019-07-16
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多