【发布时间】:2015-04-07 17:25:56
【问题描述】:
从一本操作系统书上了解到异常(如算术溢出、未定义指令、无效内存访问)会导致cpu从用户态切换到内核态,以便操作系统处理异常
在高级编程语言中,我们可以捕获和处理程序中的默认异常(如上所述)或自定义异常,例如在 C++ 中,通过使用 try 和 catch,以及 Java 和 Python 中的类似结构。
我注意到在这种情况下,用户程序中会提供异常处理程序。
通过在用户程序中显式捕获和处理异常,
默认异常是否仍会导致 cpu 从用户模式切换到内核模式,以便操作系统可以处理异常?
自定义异常是否仍会导致cpu从用户态切换到内核态,以便操作系统处理异常?
谢谢! (如果需要特定于操作系统,那么 Linux)
【问题讨论】:
-
不是真正相同类型的“异常”...
-
@Macmade;你的意思是?谢谢。
-
Tim,硬件异常总是由内核处理,由异常向量(基本上是一个函数指针数组)控制。然后内核向用户代码生成一个信号(在 Linux 上它实际上称为“信号”,在 Windows 上它是 SEH),通常您的语言的运行时库接收该信号并将其转换为该语言所称的异常,这就是程序员也可以随意扔。但硬件异常本来就不是语言异常,甚至有可能永远不会变成语言异常。
-
例如,在 Linux 上的 C++ 代码中,硬件异常是通过安装信号处理程序来处理的,因为运行时库默认不提供。 (当然,内核异常处理程序仍然参与引发信号)
-
@BenVoigt:谢谢。在一本计算机体系结构的书中,它说算术溢出、未定义的指令和无效的内存访问将导致切换到内核模式。对我来说,它们听起来像是软件异常,那么它们是硬件异常吗? (有哪些书可以找出语言异常和非语言异常的区别?)
标签: linux exception exception-handling operating-system