页面表可以被分页吗?

时间:2013-12-16 04:05:57

标签: operating-system virtual-memory

根据我的理解,它不应该是,因为它在内核空间和内核空间是不可分页的。但是对于64位地址空间,我不知道它是如何保存整页表的,因为它会非常大。有关如何实现的任何想法?

另外我想即使把它完全放在磁盘上也会占用很多空间。由于大多数VM空间未被使用,是否有办法限制页表只包含使用过的VM地址范围?

3 个答案:

答案 0 :(得分:3)

页表实际上是一棵树:它由多个子表组成。头(根)表存储指向子表的指针,子表也可以存储指向其子表的指针,等等(链中的最后一个表存储实际的页表项,当然)。由于64位地址空间中的大多数内存未使用,因此不必为所有表实际分配​​内存。根表只是将其大部分指针设置为null。

在x86_64上,有4-5个级别的这种间接。

答案 1 :(得分:1)

页表只需要保留一些可用页面的子集。它没有完整的规则。当尝试访问未由页表映射的虚拟地址时,将调用内核。然后,它可以将该映射放入页表中,如果需要,可以删除最近未使用过的其他映射。

如果需要,操作系统可以自由地保留进程可以在页表中访问的每个可能的映射。或者,如果它更喜欢这种安排,它只能保留最近使用的那些。

答案 2 :(得分:0)

来自wiki的引用 - page table

  

有人提到,创建一个包含虚拟地址空间中每个虚拟页面映射的页表结构可能最终会造成浪费。 但是,我们可以通过将页表放在虚拟内存中,并让虚拟内存系统管理页表的内存来解决过多的空间问题。

     

但是,此线性页表结构的一部分必须始终驻留在物理内存中,以防止出现圆形页面错误,从而查找不存在的页表的关键部分在页表中,页表中没有,等等。