我正在阅读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
。
PT2 = 2
,当它实际应该是PT2 = 3?
时,正如后面所说,MMU使用PT2索引来提取条目3。 3*4096+4 (PT2 entry * page size + offset)
的结果。这是对的吗?答案 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)
我没有完成从绝望和一点懒惰转换成二进制,但现在感谢你更清楚了。看到它让事情变得更加清晰。
这是前一位回答者所说的错字。毫无疑问(查看美国第4版)
“12,292字节进入数据”来自减去2 22 (4MB)(Toplevel Page表格大小= 4MB)来自4206596
TLDR:4206596 - 2 22 (4MB)= 12,292