我想,因为你使用的不是问题的情况下回答问题的第一部分是错误的:The program and data together fit in the lowest page (0-4095) The stack fits in the highest page
。因此,虽然页表项的总数为1048576,但在那些只使用2个项目的页面中,对于这2个页面中的每一个(代码/数据页面的条目0点,条目1048575指向堆栈页面)。
对于你给出一个非常有用的提示问题的第二部分:two-level paging, with 10 bits in each part
。但首先,让我们回到上面,简单的情况......
在案例1中的一个页表,虚拟地址:
- 有32位(列为
A computer has 32-bit virtual addresses
)
- 其至少12显著位指示在页面中的位置(列为
A computer has ... 4-K.B pages
,也为fit in the lowest page (0-4095)
)
剩下的20个最显著位显然选择在页表项。所选页面表项包含页面的物理地址。
因此,虚拟地址是这样的:
most significant bits least significant bits
| 20 bits = index into the page table | 12 bits = index into the page |
因此,CPU使用这个公式来访问内存:
PhysicalAddress = PageTable[VirtualAddress/4096] + VirtualAddress modulo 4096
现在,让我们回到案例2
您仍然有12个LSB位来选择页面中的一个字节。
但是有什么新东西?这是two-level paging, with 10 bits in each part
。
这10位是页表索引的长度,您现在有两个。
有了这一点,我们在虚拟地址以下击穿到达:
most significant bits least significant bits
| 10 bits = PT index | 10 bits = PT index | 12 bits = page index |
和平移公式的地址,自然是:
PhysAddr = PageTable[VirtAddr/(1024*4096)][(VirtAddr/4096) modulo 1024] + VirtAddr modulo 4096
现在,我们仍然有相同的程序占2页。
在代码/数据页指向的位置的虚拟地址(二进制):
0000000000|0000000000|xxxxxxxxxxxx
,并在堆叠页指向虚拟地址(二进制以及):
1111111111|1111111111|xxxxxxxxxxxx
由此您可以看到,您正在使用2级不同的页面表条目(由索引0000000000和1111111111选择)以及类似2级的2个不同页表条目。
因此,在案例2中总共需要2 + 2 = 4页表格条目才能运行该程序。
P.S.如果你不记得:2 = 1024,2 = 4096,2 = 1048576
10位中的每个部分= 2^10个条目= 1024个条目= 1K条目 –
确定我有这部分。那么它就会说“每个表都指向第二个页表,其中只有两个被使用。因此总共只需要三个页表条目,一个在顶层表中,另一个在每个低层表中。 “为什么只有其中两个使用(这些什么?条目?)我不能理解这一点。 –
好吧,现在看来我理解页面号和页面上的条目之间的相关性。任何人 ? –