【问题标题】:What is paging?什么是分页?
【发布时间】:2011-08-23 17:26:54
【问题描述】:

这里解释了分页,幻灯片#6:

http://www.cs.ucc.ie/~grigoras/CS2506/Lecture_6.pdf

在我的讲义中,但我终生无法理解。我知道这是一种将虚拟地址转换为物理地址的方法。因此,磁盘上的虚拟地址被分成 2^k 的块。在这之后我真的很困惑。有人可以简单地向我解释一下吗?

【问题讨论】:

  • 我天生不信任任何用 Comic Sans 写的东西;我倾向于首先找到更好的文档。 WikiPedia's Paging article 相当不错,并且有更多关于该主题的文章的链接。它可能有点杂乱无章(为什么首先有 分页虚拟内存 文章,而不是两者都有的文章?哦,好吧。)但它是写的带有完整的句子和示例(与 powerpoint 幻灯片堆栈相比)。
  • 我同意,这些笔记还有很多不足之处……尤其是没有漫画。我想我现在主要理解这个概念 - 虚拟内存被分成 2^k 的页面,然后创建一个地址。地址的低 n-k 位用于指向页表条目,高 n-k 位是页的偏移量。因此,您将它们两者连接在一起以映射到物理内存。您还可以拆分较低的 n-k 位以形成页表索引,然后可以将其索引到下一次拆分为 n-k 位...啊...现在一切都有意义了!我想?

标签: memory virtual translation paging ram


【解决方案1】:

简单地说,它是一种保存比您的地址空间通常允许的更多数据的方式。即,如果你有 32 位地址空间和 4 位虚拟地址,则可以保存 (2^32)^(2^4) 个地址(远远超过 32 位地址空间)。

【讨论】:

  • 我明白这一点,非常感谢您的回复。你能告诉我我的总结(上面)是否是对情况的正确理解?
  • 基本上是的,(为了简单起见)想象一个由两部分组成的虚拟地址可能会有所帮助:地址和页码,其中地址限制为一定数量的位,并且地址它被页码中的位数加长。
  • 非常感谢!因此,总而言之,虚拟地址空间被划分为 2^k 个页面。高 n-k 位形成页码,低位是页的偏移量。页号用作索引来获取页表条目,该条目添加到偏移量以映射到物理地址(页框)。为了提高效率,你可以把页码一分为二,前十位索引到一个页目录,后十位指向这个目录中的PTE。很抱歉重申这一点,它只是所有页面都可能非常混乱。这是正确的吗?
  • @John,我认为你说得对,但实际实现非常复杂;标准的 Linux 虚拟内存实现使用tree of depth four to hierarchically manage virtual memory -> physical memory lookups。我知道这篇文章对大多数人来说太深入了 :) 但它肯定不会让你想要了解细节。
【解决方案2】:

正如您所提到的,分页是一种虚拟内存。回答@John Curtsy 提出的问题:它通常与虚拟内存分开讨论,因为还有其他类型的虚拟内存,尽管分页现在(到目前为止)是最常见的。

分页虚拟内存非常简单:您将所有物理内存分成块,大部分大小相同(尽管在实践中选择两个或三个大小是相当普遍的)。使块大小相等,使它们可以互换。

然后你有寻址。您首先将每个地址分成两部分。一个是页面内的偏移量。您通常使用该部分的最低有效位。如果您使用(例如)4K 页面,则需要 12 位作为偏移量。使用(比如说)32 位地址空间,剩下 20 位。

从那里开始,事情确实比最初看起来要简单得多。您基本上构建了一个小的“描述符”来描述每一页内存。这将有一个线性地址(客户端应用程序用来寻址该内存的地址),一个内存的物理地址,以及一个 Present 位。还会(至少通常)有一些其他的东西,比如指示该页面中的数据是否可以读取、写入、执行等的权限。

然后,当客户端代码使用地址时,CPU 会从地址的其余部分分解页面偏移量开始。然后它获取线性地址的其余部分,并查看页面描述符以找到与该线性地址相关的物理地址。然后,为了寻址物理内存,它使用物理地址的高 20 位和线性地址的低 12 位,它们一起形成实际的物理地址,从处理器引脚上发出并从内存芯片中获取数据.

现在,我们到了获得“真正”虚拟内存的部分。当程序使用的内存多于实际可用内存时,操作系统会获取其中一些描述符的数据,并将其写入磁盘驱动器。然后它清除该内存页的“Present”位。物理内存页现在可用于其他用途。

当客户端程序尝试引用该内存时,CPU 会检查 Present 位是否已设置。如果不是,CPU 会引发异常。发生这种情况时,CPU 会像上面那样释放一块物理内存,从磁盘读回当前页面的数据,并用它现在所在的物理页面的地址填充页面描述符。完成所有这些后,它从异常中返回,CPU 重新开始执行导致异常开始的指令——除了现在,Present 位被设置,因此使用内存将起作用。

您可能还需要了解一个细节:页描述符通常排列在页表中,并且(重要的部分)您通常为系统中的每个进程拥有一组单独的页表(另一个用于操作系统内核本身)。为每个进程拥有单独的页表意味着每个进程可以使用相同的线性地址集,但它们会根据需要映射到不同的物理地址集。您还可以通过创建两个包含相同物理地址的单独页面描述符(每个进程一个)将相同的物理内存映射到多个进程。大多数操作系统都使用它,例如,如果您有两个或三个相同程序的副本正在运行,那么它实际上只有 一个 该程序的可执行代码副本在内存中 - 但是它将有两到三组指向同一代码的页面描述符,因此它们都可以使用它,而无需为每一个单独制作副本。

当然,我简化了很多——关于虚拟内存的完整书籍(而且通常相当大)已经写了很多。机器之间也有相当多的变化,添加了各种装饰,对参数进行了微小的更改(例如,页面是 4K 还是 8K)等等。尽管如此,这至少是对所发生事情的核心的一般概念(并且它仍然处于足够高的水平以大约同样适用于 ARM、x86、MIPS、SPARC 等) p>

【讨论】:

    【解决方案3】:

    分页是一种存储机制,它允许操作系统以页面的形式将进程从辅助存储中检索到主内存中。在 Paging 方法中,主内存被划分为小的固定大小的物理内存块,称为帧。帧的大小应保持与页面的大小相同,以最大限度地利用主存并避免外部碎片。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 2021-07-06
      相关资源
      最近更新 更多