显式捕获和处理的异常会导致切换到内核模式吗?

时间:2015-02-07 17:06:49

标签: linux exception exception-handling operating-system

从OS手册中,我了解到异常(例如算术溢出,未定义指令,无效内存访问)将导致cpu从用户模式切换到内核模式,以便操作系统可以处理异常

在高级编程语言中,我们可以捕获和处理默认(如上所述)或程序中的自定义异常,例如:在C ++中,通过使用trycatch,以及Java和Python中的类似构造。 我注意到在这种情况下在用户程序中给出了异常处理程序。

通过在用户程序中明确捕获和处理异常,

  • 默认异常是否会导致cpu从用户模式切换到内核模式,以便操作系统可以处理异常?

  • 自定义异常是否会导致cpu从用户模式切换到内核模式,以便操作系统可以处理异常?

谢谢! (如果需要特定于操作系统,那么Linux)

2 个答案:

答案 0 :(得分:2)

存在过度简化的风险,操作系统通常允许进程定义异常处理程序(Unix中的信号处理程序)。硬件异常进入内核模式。然后,内核模式处理程序查找用户模型处理程序并调用它。

语言运行库设置特定于操作系统的异常处理程序,以便它将调用语言定义的异常处理程序。

答案 1 :(得分:1)

Java virtual machine specification表示当抛出异常时,它会查找正确的异常处理程序:

  

Java虚拟机中的每个方法都可以与零或   更多异常处理程序。异常处理程序指定范围   抵消实现该方法的Java虚拟机代码   异常处理程序处于活动状态,描述了异常的类型   异常处理程序能够处理,并指定   处理该异常的代码的位置。例外   如果指令的偏移量匹配异常处理程序   导致异常处于异常的偏移范围内   handler和exception类型是相同的类或子类   异常处理程序处理的异常类。当一个   抛出异常,Java虚拟机会搜索匹配项   当前方法中的异常处理程序。如果是匹配的异常   找到handler,系统分支到异常处理代码   由匹配的处理程序指定。

如果找不到这样的异常处理程序 - 它将complete abruptly

  

如果执行Java Virtual,方法调用会突然完成   方法中的机器指令导致Java虚拟机   抛出异常(§2.10),并且不处理该异常   在方法内。也执行了一条指令(§athrow)   导致异常被显式抛出,如果异常是   没有被当前方法捕获,导致突然的方法调用   完成。突然完成的方法调用永远不会返回   它的调用者的价值。

至于你的问题,当它突然完成时 - 控制权被传递回内核。

相关问题