将虚拟地址转换为页表条目

时间:2014-02-21 12:59:47

标签: unix operating-system virtual-memory

我正在阅读A.S Tanenbaum的现代操作系统第3版,我来到了关于虚拟内存管理的章节。我已经被困在一段时间了,我无法理解它。要不然,这是书中的一个错字,或者我误解了一些东西。

假设我们有一个包含两个级别的多级页表,我们将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. “12,292字节进入数据”来自哪里?这是如何从虚拟地址派生的?我知道它与偏移量有关,但我无法弄清楚它是如何完成的。据我所知,物理地址是从第二页表的帧号和偏移量的组合得出的。我看到12,292是3*4096+4 (PT2 entry * page size + offset)的结果。这是对的吗?

2 个答案:

答案 0 :(得分:2)

1)我认为这确实是一个错字,因为0000000001|0000000011|000000000100二进制= 4,206,596十进制

2)回复在本书的前一段中:

  

顶级页表的条目0指向程序文本的页表,条目1指向数据的页表,条目1023指向堆栈的页表

所以他只是说0000000001|0000000011|000000000100对应0000000011|000000000100数据。实际上0000000001对应于顶级页面表中的数据,0000000011|000000000100二进制= 12,292十进制。

答案 1 :(得分:1)

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

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

  2. “12,292字节进入数据”来自减去2 22 (4MB)(Toplevel Page表格大小= 4MB)来自4206596

  3. TLDR:4206596 - 2 22 (4MB)= 12,292