St.*_*rio 2 paging x86 assembly memory-management
我阅读了一些关于页目录和页表的手册,但对这些概念仍然很困惑。例如在这里我发现只进行单级分页是在浪费内存。所以在x86架构中我们使用 2 级分页。
cr3 --> PageDirectory --> PageTable --> Page
Run Code Online (Sandbox Code Playgroud)
所以考虑下面的线性地址。
01001010101 1010101101 10101110101010
page tbl page offset
Run Code Online (Sandbox Code Playgroud)
使用page tbl位我们找到页目录条目的物理地址。PD = cr3 + L * (page tbl)其中包含页表物理地址PT。现在我们正在寻找我们的页面P = PT + L * page。所以在单层我们有一个 4MiB 的页表。现在我们总共有 1024 个页表 4KiB = 4MiB。不要看内存经济。
我错过了什么?
通常,页表远未满。对于平面页表,如果只需要前几项和最后几项,仍然需要分配整个表。使用页目录,除了第一个和最后一个页表之外的所有页表都可以省略,从而节省了大量内存。在当今拥有大量 RAM 的时代,收益似乎很小,但是当计算机总共可能只有 4 MiB 的 RAM 时,这确实是很久以前的事了。