操作系统 运行 中的页面错误处理程序位于哪个堆栈

Which stack does the page fault handler in an operating system run on

我刚才问过类似的问题,但我可能措辞不正确。因此,如果进程 A 是 运行ning,它会在内存中的位置 4000 处导致页面错误,这会导致页面错误。执行将转移到内核。那么页面错误处理程序 运行 将在哪个堆栈上?这是在内核的虚拟地址space中吗?或者堆栈 space 是否为所有此类中断保留?

Linux 并不关心你是 运行 C 还是 C++ 程序,真的。

当CPU 检测到错误地址时,它会引发中断。没有合理的方法来使用用户堆栈,因为它可能处于完全损坏的状态。对于这种严重的故障,内核有自己的私有栈。

并非普遍如此。如果你通常调用内核为你做事,内核可能会假设你有一个合理的堆栈可用。

冒着过度简化和忽略任何特定操作系统细节的风险——

Then which stack will the page fault handler run on?

大多数操作系统为每个进程分配一个(相对)小的内核模式堆栈。

当进程访问有效但未映射到物理页框的内存位置时,处理器会引发页面错误(异常)。这会导致 CPU 切换到内核模式。这会导致处理器切换到进程的内核模式堆栈并调用操作系统设置的页面错误处理程序。

每个进程(甚至线程)都必须有一个单独的内核模式堆栈,因为多个处理器可以同时处于内核模式(即使在单处理器系统中)。

中断和异常处理程序必须使用内核堆栈(防止用户模式访问)作为安全措施。如果堆栈可以在用户模式下访问,那么有人可能会破坏堆栈,然后调用内核模式处理程序。

Is this in the virtual address space of the kernel?

异常(故障和陷阱)和中断由当前正在执行但在内核模式下完成的进程处理。这是在 PROCESS 的虚拟地址 space 中完成的。

将有一些内核模式地址范围供所有进程共享。因为任何进程都必须能够处理中断,所以中断处理程序引用的所有地址都必须相同。一些系统(硬件)有一个专用的内核地址范围。其他系统将页表配置为具有共享的系统地址范围。