了解页目录
Understanding page directories
我阅读了一些关于页面目录和页面 table 的手册,但对这些概念仍然很困惑。比如here我发现只做单级分页很浪费内存。所以在x86
架构中我们使用2级分页。
cr3 --> PageDirectory --> PageTable --> Page
所以考虑下面的线性地址。
01001010101 1010101101 10101110101010
page tbl page offset
使用page tbl
位我们找到页面目录条目的物理地址。 PD = cr3 + L * (page tbl)
其中包含页面 table 物理地址 PT
。现在我们正在寻找我们的页面 P = PT + L * page
。所以在单层中我们有一页 table 4MiB。现在我们总共有 1024 页 tables 4KiB = 4MiB。没看到内存经济。
我错过了什么?
通常情况下,页面 table 远未满。对于一个平面页面table,如果只需要前几个和最后几个条目,仍然需要分配整个table。对于页目录,除了第一页和最后一页 table 之外的所有内容都可以省略,从而节省大量内存。在今天的大 RAM 时代,收益似乎很小,但在计算机总共只有 4 MiB RAM 的时候,这确实是很多。
我阅读了一些关于页面目录和页面 table 的手册,但对这些概念仍然很困惑。比如here我发现只做单级分页很浪费内存。所以在x86
架构中我们使用2级分页。
cr3 --> PageDirectory --> PageTable --> Page
所以考虑下面的线性地址。
01001010101 1010101101 10101110101010
page tbl page offset
使用page tbl
位我们找到页面目录条目的物理地址。 PD = cr3 + L * (page tbl)
其中包含页面 table 物理地址 PT
。现在我们正在寻找我们的页面 P = PT + L * page
。所以在单层中我们有一页 table 4MiB。现在我们总共有 1024 页 tables 4KiB = 4MiB。没看到内存经济。
我错过了什么?
通常情况下,页面 table 远未满。对于一个平面页面table,如果只需要前几个和最后几个条目,仍然需要分配整个table。对于页目录,除了第一页和最后一页 table 之外的所有内容都可以省略,从而节省大量内存。在今天的大 RAM 时代,收益似乎很小,但在计算机总共只有 4 MiB RAM 的时候,这确实是很多。