处理中断与处理异常

Servicing an interrupt vs servicing an exception

我的理解:异步发生的中断(硬件中断)一般是由外部事件直接中断CPU引起的。然后 CPU 将指向特定的 ISR 来处理中断。 显然,ISR 不能具有 return 值或传递参数,因为事件在我们代码的任何执行点随时发生。

不过也有例外,我的理解是这是一个软件中断,是由软件中的一条特殊指令pd引起的。

我听说异常的处理方式与处理 ISR 的方式类似。在这种情况下,异常处理程序是否可以通过从代码中获取参数和 return 值来表现出与 ISR 不同的行为,因为我们知道执行代码时我们在代码中的位置?

提前致谢

术语 "exception" 可以表示完全不同的意思。

异常处理的形式有"software exceptions",作为C++等语言的高级语言特性。 "exception handler" 在这种情况下类似于 try { } catch 块。

还有 "hardware exceptions",这是一些 CPU 核心使用的术语,例如 PowerPC。这些是与错误状态相对应的关键中断形式。此上下文中的 "exception handler" 类似于中断向量 table,尽管发生硬件异常时,软件通常无能为力。

硬件异常不带参数且return不带数据,就像中断一样。 PowerPC 等架构将硬件异常与硬件中断分开,前者是各种错误状态,后者是来自应用程序特定硬件的中断。

硬件异常与软件通信并不是那么有意义,因为它们是由关键故障产生的,例如执行错误的 OP 代码、CPU 时钟坏了、代码失控等。也就是说,执行环境已受到损害,因此在该环境中执行的软件可能无法执行任何有意义的操作。

一个硬件异常不是软件中断,你没有明确地调用它——它发生在一些硬件检测table 错误如:

  • 无效地址
  • 无效指令
  • 对齐无效
  • 除以零

您当然可以编写代码来故意引起这些中的任何一个,因此将它们用作软件中断,但是您可能会失去它们作为真正错误陷阱的实用性。异常在某些情况下用于此目的 - 例如在架构上没有 FPU 的处理器中,FPU 是一个选项,无效指令处理程序可用于实现 FPU 的软件仿真,以便编译器不需要为 FPU 和非 FPU 变体生成不同的代码。类似地,无效地址异常可以调用内存管理器来实现虚拟内存交换文件(在具有 MMU 的设备上)。

软件中断由SWI指令显式调用的。与简单的函数调用相比,它的好处是应用程序不需要知道处理程序的位置 - 由向量 table 确定,并且通常用于在简单的操作系统中进行操作系统或 BIOS 调用动态加载代码,但不支持动态链接(例如 MS-DOS 以这种方式工作)。

硬件中断、软件中断和异常的共同点是它们在与正常代码不同的处理器上下文中执行——通常切换到独立堆栈并自动压入寄存器(或使用备用寄存器组)。它们都是通过向量table来操作的,你不能通过形式函数参数传递和return来传递或return参数。使用 SWI 和强制异常,可以将值加载到处理程序已知的特定寄存器或内存位置。

以上是一般原则 - 不同架构的具体细节会有所不同。请参阅所用特定设备的技术参考。