我认为,问题第一部分的答案是错误的,因为您没有使用问题的上下文: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
从这里您可以看到您在级别 1 使用了 2 个不同的页表条目(由索引 0000000000 和 1111111111 选择),并且在级别 2 使用了类似的 2 个不同的页表条目。
因此,在情况 2 中,程序运行所需的总页表条目为 2+2=4。
PS如果你不记得:2 10 = 1024, 2 12 = 4096, 2 20 = 1048576。