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

C++ 操作系统如何检测进程崩溃,c++,x86,crash,osdev,C++,X86,Crash,Osdev,操作系统如何知道EIP不再是有效/合法的指令,并且应用程序已崩溃?它如何知道何时生成崩溃转储数据?在x86兼容处理器上,当EIP指向没有读取权限的页面、未映射的页面、无效指令、或有效指令未经许可尝试访问内存页面或未映射的页面时,或者divide指令看到分母为零,或者执行INT指令,或者引发异常。当当前特权级别(CPL)大于0时,在保护模式下发生异常 从名为的内存部分加载SS和ESP的值 将SS、ESP、EFLAGS、CS和EIP的值推送到堆栈上。SS和ESP值是以前的值,而不是TSS中的新值

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

在x86兼容处理器上,当EIP指向没有读取权限的页面、未映射的页面、无效指令、或有效指令未经许可尝试访问内存页面或未映射的页面时,或者divide指令看到分母为零,或者执行
INT
指令,或者引发异常。当当前特权级别(CPL)大于0时,在保护模式下发生异常

  • 从名为的内存部分加载SS和ESP的值

  • 将SS、ESP、EFLAGS、CS和EIP的值推送到堆栈上。SS和ESP值是以前的值,而不是TSS中的新值

  • 某些异常还会将错误代码推送到堆栈上

  • 从中获取CS和EIP的值,并将这些值放入CS和EIP中

请注意,内核已经预先设置了这些表和段

然后:

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

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

在x86兼容处理器上,当EIP指向没有读取权限的页、未映射的页、无效指令,或者当有效指令试图在没有权限的情况下访问内存页时,或未映射的页,或divide指令看到分母为零,或执行
INT
指令,或引发异常。当当前特权级别(CPL)大于0时,在保护模式下发生异常

  • 从名为的内存部分加载SS和ESP的值

  • 将SS、ESP、EFLAGS、CS和EIP的值推送到堆栈上。SS和ESP值是以前的值,而不是TSS中的新值

  • 某些异常还会将错误代码推送到堆栈上

  • 从中获取CS和EIP的值,并将这些值放入CS和EIP中

请注意,内核已经预先设置了这些表和段

然后:

  • 内核决定如何处理异常。这取决于特定的内核。通常,它决定终止你的程序。在Linux上,可以使用信号处理覆盖此默认值,在Windows上,可以使用结构化异常处理覆盖此默认值
(这不是对x86异常处理的详尽引用。这是对最常见情况的简要概述。)

来自@user253751的详细答案供您了解所有您可能想知道的内容

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

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

硬件异常机制用于知道进程试图做一些不可能/无效的事情,因为当前配置广泛借用了中断机制,但它还必须注意(可能是)用户级代码之间的上下文切换,以“故障”为准处理故障的进程级和内核级代码。该上下文切换是我们在描述硬件异常时看到堆栈指针重新加载和任务状态段的原因,这些硬件异常在其他体系结构上具有更简单的定义(例如地址0xfffff000处的exectue指令)

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

来自@user253751的详细答案就在这里,你可以知道你想知道的一切

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

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

硬件异常机制用于知道进程试图做一些不可能/无效的事情,因为当前配置广泛借用了中断机制,但它还必须注意(可能是)用户级代码之间的上下文切换,以“故障”为准处理故障的进程级和内核级代码。该上下文切换是我们在描述硬件异常时看到堆栈指针重新加载和任务状态段的原因,这些硬件异常在其他体系结构上具有更简单的定义(例如地址0xfffff000处的exectue指令)

请注意,出现硬件异常并不一定意味着进程崩溃