【问题标题】:Converting virtual address to page table entry将虚拟地址转换为页表条目
【发布时间】:2014-03-23 00:16:40
【问题描述】:

我正在阅读 A.S Tanenbaum 的 Modern Operating Systems 3rd Edition,我已经阅读了有关虚拟内存管理的章节。我已经被困在某个部分有一段时间了,我无法理解它。要么是书中的错字,要么是我误解了什么。

假设我们有一个具有两层的多级页表,我们将 32 位虚拟地址映射到物理内存帧。

页表的字段和偏移量是

10 | 10 | 12

意味着我们有一个包含 1024 个条目的顶级页表,页大小为 4096 字节或 4KB。顶层页表入口0指向文本段页表,入口1指向数据段,1023入口指向堆栈页表。

这是从书中引用的:

例如,考虑 32 位虚拟地址 0x00403004 (十进制 4,206,596),即数据中的 12,292 个字节。这个虚拟 地址对应于 PT 1 = 1、PT2 = 2 和 Offset = 4。MMU 首先使用 PT1 索引到顶级页表并获取条目 1,对应地址4M到8M。然后它使用 PT2 来索引 进入刚才找到的二级页表,提取条目3, 对应于其 4M 块内的地址 12288 到 16383(即, 绝对地址 4,206,592 到 4,210,687)。

当我将地址转换为二进制时,我得到0000000001|0000000011|000000000100,对我来说它对应于PT1 = 1, PT2 = 3, Offset = 4

  1. 我是否遗漏了什么,或者这是在书中指出 PT2 = 2 的错字,而实际上应该是 PT2 = 3? 正如后面的文字所说,MMU 使用 PT2 索引来提取条目 3。
  2. “12292 字节插入数据”从何而来?它是如何从虚拟地址派生而来的?我知道它与偏移量有关,但我无法弄清楚它是如何完成的。据我了解,物理地址是由第二页表中的帧号和偏移量的组合得出的。我看到 12,292 是 3*4096+4 (PT2 entry * page size + offset) 的结果。这是正确的吗?

【问题讨论】:

    标签: unix operating-system virtual-memory


    【解决方案1】:

    1) 我认为这确实是一个错字,0000000001|0000000011|000000000100 binary = 4,206,596 decimal

    2) 答案在本书的前一段中:

    顶层页表的entry 0指向程序文本的页表,entry 1指向数据的页表,entry 1023指向堆栈的页表

    所以他只是说0000000001|0000000011|000000000100对应0000000011|000000000100进入数据。确实0000000001对应顶级页表中的数据,0000000011|000000000100二进制=12292十进制。

    【讨论】:

      【解决方案2】:

      由于绝望和一点点懒惰,我没有完成转换为二进制,但多亏了你,它现在更清晰了。看到它让事情变得更加清晰。

      1. 正如前面的回答者所说,这是一个错字。毫无疑问(查看美国第 4 版)

      2. “12,292 bytes into the data”来自于从 4206596 中减去 222 (4MB)(Toplevel Page table entry size=4MB)

      TLDR:4206596 - 222 (4MB) = 12,292

      【讨论】:

        猜你喜欢
        • 2019-02-28
        • 2011-07-23
        • 2017-03-10
        • 2018-12-04
        • 1970-01-01
        • 1970-01-01
        • 2016-02-08
        • 1970-01-01
        相关资源
        最近更新 更多