C++ 操作系统如何检测进程崩溃
操作系统如何知道EIP不再是有效/合法的指令,并且应用程序已崩溃?它如何知道何时生成崩溃转储数据?在x86兼容处理器上,当EIP指向没有读取权限的页面、未映射的页面、无效指令、或有效指令未经许可尝试访问内存页面或未映射的页面时,或者divide指令看到分母为零,或者执行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中的新值
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上,可以使用结构化异常处理覆盖此默认值