在非法内存读取或跳转后恢复IP寄存器

时间:2016-04-26 10:05:24

标签: c assembly x86 operating-system kernel

指令指针寄存器如何从错误读取或错误跳转中恢复? 内核调用init代码调用main()程序。如果main()程序使堆栈溢出或其他任何内容和RIP/EIP/IP填充垃圾,操作系统如何恢复CPU寄存器?

CPU只有一个指令指针对吗?因此,从我的观点来看,从溢出中恢复似乎是不可能的。

3 个答案:

答案 0 :(得分:2)

是的,如果IP被破坏并导致故障,则只知道坏值。目前还不清楚“从溢出中恢复”是什么意思。当然,操作系统的故障处理程序有一个定义良好的地址,然后cpu就在那里,因此从那时起就可以很好地定义IP。操作系统可能决定终止进程,或者如果程序安装了信号/异常处理程序,操作系统将确保调用该进程。然后,此处理程序可以使用适当的值加载IP。

答案 1 :(得分:1)

当您在用户模式中删除IP时,最终会发生硬件故障,无论是页面错误,非法操作码还是类似的错误。然后处理器切换到管理程序/内核模式,并通过将指令指针设置为明确定义的值来开始运行故障处理程序。

然后,内核代码将检查发生异常的地址和/或异常的类型。一旦发现这是因为任何这些,通常内核将终止故障的用户模式过程。

答案 2 :(得分:1)

如果IP加载了无法执行的地址,则会触发 EXCEPTION 。 CPU通常会识别许多不同类型的异常,并且它们由不同的数字标识。

发生异常时,会导致CPU切换到内核模式。这反过来导致CPU使用定义的处理程序的地址加载IP,以处理特定类型的异常并加载内核模式堆栈。

有两种类型的例外:错误陷阱。发生故障后,可以重新启动IP中的原始指令。陷阱是一个致命的错误。此时发生的事情取决于异常的类型。

如果页面出现错误,处理程序将尝试将页面加载到内存中。

对于大多数其他异常,处理程序将尝试为特定类型的异常查找用户模式处理程序。请参阅太监中的信号功能。