递归页面错误处理程序
Recursive page fault handler
我有一个关于操作系统和页面错误处理程序的概念性问题。让我们考虑内核有一个虚拟地址 space 的情况。因此,如果存在页面错误并且执行跳转到页面错误处理程序。如果用于执行页面错误处理程序的堆栈导致页面错误,那么会发生什么?
if the stack for the execution of the page fault handler causes a page fault what happens then?
没有为处理程序保留的堆栈。
页面错误处理例程是操作系统内核的一部分,因此在内核中 space。即使内核内存仍然组织成页面,这些页面仍然驻留在物理内存中并且不会换出到磁盘。换出到磁盘的东西在用户 space 中。因此,由于内核内存不会被换出,因此在内核尝试处理页面错误时不会生成页面错误。
如果您考虑一下,这是有道理的。如果处理页面错误的代码需要页面错误处理程序将其自身返回到物理内存,则内核将无法处理任何页面错误。那就不行了。
原则上,如果我们仍然尝试假设您的场景,那么我认为内核会:
- 需要变得更复杂才能处理您提出的这个案例;
- 无法使用或支持虚拟地址 spaces and/or 交换内存;
- 一旦发生第一个页面错误就会崩溃(例如,可能是内核崩溃)
我有一个关于操作系统和页面错误处理程序的概念性问题。让我们考虑内核有一个虚拟地址 space 的情况。因此,如果存在页面错误并且执行跳转到页面错误处理程序。如果用于执行页面错误处理程序的堆栈导致页面错误,那么会发生什么?
if the stack for the execution of the page fault handler causes a page fault what happens then?
没有为处理程序保留的堆栈。
页面错误处理例程是操作系统内核的一部分,因此在内核中 space。即使内核内存仍然组织成页面,这些页面仍然驻留在物理内存中并且不会换出到磁盘。换出到磁盘的东西在用户 space 中。因此,由于内核内存不会被换出,因此在内核尝试处理页面错误时不会生成页面错误。
如果您考虑一下,这是有道理的。如果处理页面错误的代码需要页面错误处理程序将其自身返回到物理内存,则内核将无法处理任何页面错误。那就不行了。
原则上,如果我们仍然尝试假设您的场景,那么我认为内核会:
- 需要变得更复杂才能处理您提出的这个案例;
- 无法使用或支持虚拟地址 spaces and/or 交换内存;
- 一旦发生第一个页面错误就会崩溃(例如,可能是内核崩溃)