【发布时间】: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