从OS手册中,我了解到异常(例如算术溢出,未定义指令,无效内存访问)将导致cpu从用户模式切换到内核模式,以便操作系统可以处理异常
在高级编程语言中,我们可以捕获和处理默认(如上所述)或程序中的自定义异常,例如:在C ++中,通过使用try
和catch
,以及Java和Python中的类似构造。
我注意到在这种情况下在用户程序中给出了异常处理程序。
通过在用户程序中明确捕获和处理异常,
默认异常是否会导致cpu从用户模式切换到内核模式,以便操作系统可以处理异常?
自定义异常是否会导致cpu从用户模式切换到内核模式,以便操作系统可以处理异常?
谢谢! (如果需要特定于操作系统,那么Linux)
答案 0 :(得分:2)
存在过度简化的风险,操作系统通常允许进程定义异常处理程序(Unix中的信号处理程序)。硬件异常进入内核模式。然后,内核模式处理程序查找用户模型处理程序并调用它。
语言运行库设置特定于操作系统的异常处理程序,以便它将调用语言定义的异常处理程序。
答案 1 :(得分:1)
Java virtual machine specification表示当抛出异常时,它会查找正确的异常处理程序:
Java虚拟机中的每个方法都可以与零或 更多异常处理程序。异常处理程序指定范围 抵消实现该方法的Java虚拟机代码 异常处理程序处于活动状态,描述了异常的类型 异常处理程序能够处理,并指定 处理该异常的代码的位置。例外 如果指令的偏移量匹配异常处理程序 导致异常处于异常的偏移范围内 handler和exception类型是相同的类或子类 异常处理程序处理的异常类。当一个 抛出异常,Java虚拟机会搜索匹配项 当前方法中的异常处理程序。如果是匹配的异常 找到handler,系统分支到异常处理代码 由匹配的处理程序指定。
如果找不到这样的异常处理程序 - 它将complete abruptly:
如果执行Java Virtual,方法调用会突然完成 方法中的机器指令导致Java虚拟机 抛出异常(§2.10),并且不处理该异常 在方法内。也执行了一条指令(§athrow) 导致异常被显式抛出,如果异常是 没有被当前方法捕获,导致突然的方法调用 完成。突然完成的方法调用永远不会返回 它的调用者的价值。
至于你的问题,当它突然完成时 - 控制权被传递回内核。