【问题标题】:What is the difference between a page and a page table?页和页表有什么区别?
【发布时间】:2021-09-28 15:42:27
【问题描述】:

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

【问题讨论】:

  • 如果你对这个主题感兴趣,你会很快发现谷歌搜索甚至 SO 问题都不足以深入研究这个问题。我强烈建议买一本好书并从中学习。 Tanenbaum 的 Modern Operating Systems 可能是该领域最受推崇的。

标签: memory memory-management operating-system


【解决方案1】:

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

什么是页表

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

映射需要什么信息

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

如何减小页表的大小

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

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

还有很多细节在SO帖子中无法真正阐明,我建议您选择一本好书,例如Modern Operating SystemsOperating Systems: Three Easy Pieces

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 2017-01-30
    • 2019-10-05
    • 2016-08-30
    • 2015-07-04
    • 1970-01-01
    • 2017-03-05
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多