OS 如何检测进程崩溃

How does OS detect a crash of a process

OS 如何知道 EIP 不再是 valid/legal 指令并且该应用程序已崩溃?它如何知道何时生成故障转储数据?

在 x86 兼容处理器上,当 EIP 指向没有读取权限的页面、未映射的页面、无效指令或有效指令试图未经许可访问内存页面时,或未映射的页面,或除法指令发现分母为零,或执行 INT 指令,或 a bunch of other things, it raises an exception. In the case of an exception occuring in protected mode when the current privilege level (CPL) is > 0, the following things occur:

  • 从名为 task state segment 的内存部分加载 SS 和 ESP 的值。

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

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

  • interrupt descriptor table 获取 CS 和 EIP 的值并将这些值放入 CS 和 EIP。

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

然后:

  • 内核决定如何处理异常。这取决于具体的内核。通常,它会决定终止您的程序。在 Linux 上,您可以使用 信号处理 覆盖此默认值,在 Windows 上,您可以使用 结构化异常处理 覆盖它.

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

来自@user253751 的详细解答,让你知道你可能想知道的一切。

上下文可能会有所帮助:处理器通常在每条指令结束后继续执行下一条指令,但在某些情况下它会突然启动一条完全不相关的指令。这称为 中断,广泛用于支持设备操作或获取定期调用的代码。

在中断处理程序中,我们必须保存完整的处理器状态,以便在处理完特定于设备的代码后可以安全地恢复被中断的代码。

硬件异常机制用于知道一个进程正在尝试做某事impossible/invalid给定当前配置广泛借用中断机制,但它也有处理 "faulty" 进程的(大概)用户级代码和处理故障的内核级代码之间的上下文切换。该上下文切换是我们看到堆栈指针重新加载和任务状态段参与硬件异常描述的原因,这些硬件异常在其他架构上具有更简单的定义(例如地址 0xfffff000 处的执行指令)。

请注意,出现硬件异常并不一定意味着进程崩溃了。内核中的异常处理程序通常必须比较一些信息(我们试图访问什么地址,在该地址映射了什么对象等)并且要么做有用的工作(将映射文件的另一页放入内存)和恢复进程,或称其为无效访问。