页面和页面table有什么区别?

What is the difference between a page and a page table?

我知道页面 table 负责通过使用类似映射的结构将虚拟地址转换为物理地址,页面是虚拟内存中某种固定大小的块。但是这两者有什么关系呢?每个页面(虚拟)是否都使用页面 table 转换为物理地址(物理页面)?为什么我们需要将虚拟内存组织成固定页面?我试过谷歌搜索但找不到一些明确的答案。感谢任何输入。

假设您有一个没有虚拟内存的系统,并且程序发出了一条指令,例如 MOV REG,0,它有效地访问了物理地址 0。然后您意识到,由于程序可以在彼此的内存上读写区域,此实施可能会导致问题。所以我们引入虚拟内存

页面是什么table

我们想要维护一个映射,程序仍然会以类似的方式生成地址(我们现在称之为虚拟地址)但是在将内存访问指令发送到内存之前我们将提供它们到我们的 MMU 单元,它将为我们提供一个物理地址,然后我们将这个地址发送到内存。

映射需要哪些信息

在简单的方法中,我们在table中存储两个条目,虚拟地址和物理地址。假设我们使用 32 位系统,因此在这种简单方法中,每个页面 table 条目将花费我们 64 位或 8 字节。所以每个条目 8 个字节并且有 2^32 个地址,我们的页面 table 将占用大量内存。

如何缩小页面大小table

由于我们不想在页面 table 上浪费 (2^32)*8 个字节,我们决定不为每个地址添加条目,而是划分我们的物理内存成大小为 4 KB 的帧。这意味着我们有 (2^32)/(2^12) = 2^20 帧,在此设置中我们只需要地址的前 20 位来标识页面本身,其余 12 位是偏移位。所以所有以 00000000000000000000 开头的条目都在第 1 页,其中 00000000000000000000000000000000 是第一个地址,000000000000000000000111111111111 是本页的最后一个地址。所以现在我们按以下方式存储我们的映射

假设现在我们收到 MOV REG,0 指令,所以我们检查页面 table,因为地址 0 在 0 和 4K 之间,它位于第一页并映射到第 2 帧。所以我们用第 2 帧的基地址替换为我们提供页面基地址的前 20 位,我们得到了我们的物理地址,我们将其传递给内存。

还是有很多细节没能在SO中真正搞清楚post,建议你挑一本好书比如Modern Operating Systems or Operating Systems: Three Easy Pieces