【问题标题】:Paging - What is exactly "inside" of a Page?分页 - 页面的“内部”究竟是什么?
【发布时间】:2018-06-19 00:52:00
【问题描述】:

根据我对虚拟地址转换如何发生的理解(假设是 32 位虚拟地址空间,如在 x86 架构中):

  • 虚拟地址的第 31:22 位指示要访问的正确页目录条目(即页表的对齐物理地址)
  • 同样,虚拟地址的位 21:12 指示要访问的正确页表条目(即页本身的对齐物理地址)
  • 最后,位 11:0 表示页中的正确偏移量,并且仅附加到最终物理地址的末尾以进行访问

至于物理地址

  • 位 31:12 是页面的物理基地址(对齐)(从 PTE 中找到)
  • 位 11:0 与虚拟地址中的相同

Visually, this is what happens

我知道 Page 是一块虚拟内存。但从概念上讲,我很难想象页面的实际“内部”是什么。即,如果我要索引到“页面条目”(如果这样的事情甚至有意义),我会得到什么回报?

This post 似乎将此值称为“所需字节”。 “所需字节”到底是什么?我是否过度考虑了 Pages 的功能?

【问题讨论】:

  • '这篇文章似乎将此值称为“所需字节”。' -> 我在那篇文章的任何地方都找不到那个短语。你是从哪里得到这个词的?

标签: memory-management x86 operating-system paging virtual-memory


【解决方案1】:

您可以将每个页面视为一个 4096 字节的“数组”。 (在具有 4k 页的 x86 上)。它不是高级语言意义上的“数组”(除非您的程序中碰巧有一个页面对齐的字节数组),但它是一个字节的线性集合,您可以使用偏移量对其进行索引.

来自任何特定地址的单字节加载在特定页面内都有一个偏移量,该偏移量决定了应该加载这 4096 个字节中的哪一个。地址的低 12 位决定了这个偏移量。 (即“页面偏移量”)。

请注意,2^12 = 4096,这就是为什么低 12 位表示地址中页面内的偏移量。

延伸阅读:What Every Programmer Should Know About Memory?

【讨论】:

    【解决方案2】:

    通过阅读您的问题,听起来您的误解是因为您不了解页表条目的格式。

    CPU 的内存管理单元 (MMU) 将物理内存划分为一些固定大小的 PAGE FRAMES(通常为 512K 到 1MB)。

    操作系统管理 PAGES 内存。页必须与页框大小相同。用户模式进程只看到页面;不是页框。

    操作系统维护着提供页面和页面框架之间映射的页面表集。

    在逻辑内存系统中,地址中的位由两个位域组成。一个位域标识页面,另一个指定到页面的字节偏移量。

    当一个进程访问一个地址时,MMU 将它分成两位字段。然后它使用页面标识符来查找页面映射到页表中的哪个页框。

    。即,如果我要索引到“页面条目”(如果这样的事情甚至有意义),我会得到什么回报?

    页条目(或页表中的条目)指定物理页框的编号。

    [这听起来像是你缺少的部分。]

    在您的示例中,您讨论了一个多级页表,但为简单起见,我们假设没有页目录,只有一个页表。

    在 32 位系统中,页面条目通常为 32 位,而在 64 位系统上则为 64 位。页面条目的格式因系统而异,但可能有位字段定义:

    1. 映射到的页框的索引。
    2. 指示条目是否有效的位。
    3. 一个位表示相应的页面是否已被写入。
    4. 位指定页面的保护。

    在您的示例中,您省略了页表条目的格式。

    因此,一旦您有了条目,下一步就是从中获取页框。 在您的示例中,这是 4096 字节的数据。

    MMU 可以只使用页框索引来识别页面。或者它可以将该值乘以页面大小以获得开始页面的字节。

    要获取 4096 中的特定字节,MMU 使用偏移量(在您的示例中为 0:11 位)

    MMU 在幕后完成所有这些工作,因此进程永远不会看到它。操作系统的主要工作之一是维护页表和其中的条目。

    【讨论】:

    • 您的“通常为 512K 到 1MB”的声明似乎遥不可及。大多数虚拟内存系统使用 4kiB 页面/页框。例如x86。 MIPS supports a choice of 4k / 16k / 64k。某些系统具有用于大型映射的“巨页”,例如 x86-64 的 2MiB 或 1GiB 巨页。 unix.stackexchange.com/questions/128213/… 说“正常”页面大小几乎是 4kiB,但 AArch64 允许使用 16kiB 粒度而不是 4k 的页表。
    • 显然,您所使用的系统范围有限。
    • 是的,我只真正使用过 x86(以及大学里的一些 SPARC 机器),并阅读了一些其他主流架构,尤其是 ARM、MIPS 和 PowerPC。我并不是说没有 512k 或 1M 页面是最小选项的系统,我是说这不是“典型的”。你需要足够多的例子来超过 Linux 运行的大多数架构......
    • 我和彼得在这里。几乎无论您如何权衡,绝大多数主流架构(对于“主流”的广泛定义)的最小/默认页面大小都小于 512K,通常要小得多。如果你不知道,你应该提供一些反例。
    • 您没有看过 VAX 吗?虽然有点旧,但到处都有使用 512 字节页面控制关键功能的地方。
    猜你喜欢
    • 2011-03-03
    • 2011-08-19
    • 2014-10-28
    • 2012-08-27
    • 2010-11-12
    • 2011-03-18
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多