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