分页 - 究竟是什么"内部"一页?

时间:2018-01-09 22:20:22

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

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

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

至于物理地址

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

Visually, this is what happens

我知道Page是一块虚拟内存。但从概念上讲,我很难想象实际上是什么"内部"一页。即,如果我要编入一个" Page entry" (如果这样的事情甚至有意义),我会得到什么呢?

This post 似乎将此值称为"所需的字节。"究竟是什么"所需的字节"?我是否过度思考Pages的功能?

2 个答案:

答案 0 :(得分:1)

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

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

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

操作系统维护一组PAGE TABLES,它们提供页面和页面框架之间的映射。

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

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

  

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

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

[这听起来像是你失踪的部分。]

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

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

  1. 映射到。
  2. 的页面框架的索引
  3. 指示条目是否有效的位。
  4. 指示相应页面是否已写入。
  5. 指定页面的保护。
  6. 在您的示例中,您省略了页表条目的格式。

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

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

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

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

答案 1 :(得分:0)

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

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

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

进一步阅读:What Every Programmer Should Know About Memory?