递归页面错误处理程序

时间:2016-01-28 07:43:24

标签: c++ linux operating-system virtual-memory

我有一个关于操作系统和页面错误处理程序的概念性问题。让我们考虑内核具有虚拟地址空间的情况。因此,如果存在页面错误并且执行跳转到页面错误处理程序。如果用于执行页面错误处理程序的堆栈导致页面错误,那么会发生什么?

1 个答案:

答案 0 :(得分:3)

  

如果执行页面错误处理程序的堆栈导致页面错误,那么会发生什么?

处理程序没有保留堆栈。

页面错误处理例程是操作系统内核的一部分,因此也是内核空间的一部分。即使内核内存仍然被组织成页面,这些页面仍然驻留在物理内存中,并且不会被换出到磁盘。被换出到磁盘的东西都在用户空间中。因此,由于内核内存不会被换出,因此在内核尝试处理页面错误时不会生成页面错误。

如果您考虑一下,这是有道理的。如果处理页面错误的代码需要页面错误处理程序让自己回到物理内存中,内核将无法处理任何页面错误。它无法这样做。

原则上,如果我们仍然尝试假设你的场景,那么我认为内核会:

  • 为了处理你提出的这个案子需要变得更加复杂;
  • 无法使用或支持虚拟地址空间和/或交换内存;
  • 一旦发生第一页错误(例如可能是内核恐慌),
  • 就会崩溃