操作系统如何检测进程崩溃

use*_*073 1 c++ crash x86 osdev

操作系统如何知道 EIP 不再是有效/合法的指令并且该应用程序已崩溃?它如何知道何时生成故障转储数据?

use*_*751 6

在兼容 x86 的处理器上,当 EIP 指向没有读取权限的页面、未映射的页面、无效指令或有效指令试图未经许可访问内存页面时,或未映射,或者除法指令看到分母为零,或者INT执行了一条指令,或者一堆其他事情,它会引发异常。当当前权限级别(CPL) > 0 时,在保护模式下发生异常的情况下,会发生以下情况:

  • 从称为任务状态段的内存部分加载 SS 和 ESP 的值。

  • 将 SS、ESP、EFLAGS、CS 和 EIP 的值压入堆栈。SS 和 ESP 值是以前的值,而不是来自 TSS 的新值。

  • 一些异常还会将错误代码压入堆栈。

  • 中断描述符表中获取 CS 和 EIP 的值,并将这些值放入 CS 和 EIP。

注意内核已经提前设置好了这些表和段。

然后:

  • 内核决定如何处理异常。这取决于特定的内核。通常,它决定终止您的程序。在 Linux 上,您可以使用信号处理覆盖此默认值,而在 Windows 上,您可以使用Structured Exception Handling覆盖它。

(这不是对 x86 异常处理的详尽参考。这是最常见情况的简要概述。)

  • 附注:此处使用的异常与 C++ 异常完全无关。它们发生在 C++ 运行时下,无法使用“try”/“catch”块捕获。 (3认同)