0

让我们考虑页面大小等于1 KB。表中的一项需要2B. 页表占用不超过一页(所以<= 1KB)。

我们可以得出结论,操作内存的大小是<= 512 KB

正确答案是否定的,但我无法理解。对我来说,答案是肯定的——请看看我的推理,告诉我我哪里错了。

表包含<=1024B/2B=512=2^9页表中的条目。页面大小为1024B=2^10B,因此偏移量不超过<=10位。页数占位<=9- 因为我们有512=2^9条目。因此,9+10=19。因此<=2^19 bits使解决成为可能<= 2^19 B=2^9KB=512KB

我哪里错了?

4

1 回答 1

0

一个页表项是 2B,所以一个表项可以指向 2^16 个物理页之一。那是 2*16 kiB(因为页面是 1kB)。因此内核可以使用多达 65536 kiB (64MiB) 的物理内存。

这假定整个页表条目 (PTE) 是一个物理页号。如果 PTE 在页表中的位置将其与虚拟地址相关联,则可以使用。即,虚拟地址的 9 位用作 PT 的索引,以选择 PTE。

我们不能假设机器确实以这种方式工作,但同样我们也不能假设它没有,直到我们获得更多信息。

仅考虑问题中的信息,我们可以得出结论:

  • 可用物理内存最高可达 65536kiB。
  • 一次最多可以映射 512 个虚拟页面 (512kiB)。
  • 别的不多!许多可能性是开放的。

更有可能的设计在每个 PTE 中都有一个有效/无效位。

如果 PTE 的内容(而不是它的位置)指示它映射的虚拟页面,则可以将大的虚拟地址空间映射到很少的物理页面上。这个地址空间必然是稀疏映射的,但是内核可以通过保留一个单独的映射表来给进程一种拥有大量活动映射错觉

所以在页面错误时,内核会检查页面是否应该被映射。如果是这样,它将映射放入 PTE 并恢复该过程。(这种事情发生在真实的操作系统中,它被称为次要页面错误。)

在这种设计中,内核使用页表来保存实际映射的子集类似于软件管理的 TLB。(当然,这种架构可能有一个不连贯的 TLB,需要在每次 PTE 修改后失效,所以这可能会执行得很糟糕)。

于 2016-09-09T19:52:53.063 回答