1

嘿,我有一个问题和一个答案,但我无法理解答案的第二部分!可以请任何人帮助我吗?

这里是:

问题;

计算机具有 32 位虚拟地址和 4 KB 页。程序和数据一起放入最低页 (0-4095) 堆栈放入最高页。如果使用传统(一级)分页,页表中需要多少条目?两级分页需要多少页表项,每部分 10 位?

回答;

对于一级页表,需要 2^32 /2^12 或 1M 页。因此页表必须有 1M 个条目。对于两级分页,主页表有 1K 个条目,每个条目指向第二个页表。仅使用其中两个。因此总共只需要三个页表条目,一个在顶级表中,一个在每个低级表中。

我看不懂加粗的。例如,我无法理解这个 1K 是如何出现的。

谢谢你的时间,

干杯!

4

1 回答 1

8

我认为,问题第一部分的答案是错误的,因为您没有使用问题的上下文:The program and data toget­her 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 中,虚拟地址:

  1. 有 32 位(给定为A computer has 32-bit virtual addresses
  2. 它们的 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。

于 2012-09-19T00:42:37.037 回答