📜  中断与异常

📅  最后修改于: 2021-06-28 09:20:50             🧑  作者: Mango

异常和中断是意外事件,它们会中断指令的正常执行流程(当前正在由处理器执行)。异常是来自处理器内部的意外事件。中断是进程外部的意外事件。

每当发生异常或中断时,硬件就会开始执行响应异常而执行操作的代码。此操作可能涉及终止进程,输出错误消息,与外部设备通信,或者通过启动“死亡蓝屏”并暂停CPU来使整个计算机系统崩溃。负责此操作的指令位于操作系统内核中,执行此操作的代码称为中断处理程序代码。现在,我们可以将处理程序代码视为操作系统子例程。然后,在执行处理程序代码之后,可以在发生执行或中断的指令之后继续执行。

异常和中断处理:
无论何时发生异常或中断,执行都会从用户模式转换为处理异常或中断的内核模式。详细地,必须采取以下步骤来处理异常或中断。

进入内核时,必须先将当前正在执行的进程的上下文(所有CPU寄存器的值)保存到内存中。内核现在可以处理异常/中断了。

  1. 确定异常/中断的原因。
  2. 处理异常/中断。

处理完异常/中断后,内核将执行以下步骤:

  1. 选择一个要还原和恢复的过程。
  2. 恢复所选进程的上下文。
  3. 恢复所选进程的执行。

在任何时间点,CPU中所有寄存器的值都定义了CPU的上下文。用于CPU上下文的另一个名称是CPU状态。

异常/中断处理程序使用与当前正在执行的进程相同的CPU。进入异常/中断处理程序时,必须将所有CPU /寄存器中要由异常/中断处理程序使用的值保存到内存中。稍后可以在继续执行过程之前恢复已保存的寄存器值。

可能由于多种原因调用了该处理程序。因此,处理程序需要确定异常或中断的原因。有关导致异常或中断的原因的信息可以存储在专用寄存器中,也可以存储在内存中的预定义地址中。

接下来,需要处理异常或中断。例如,如果是键盘中断,那么将获得按键的键代码并将其存储在某个地方,或者采取其他适当的措施。如果是算术溢出异常,则可能会打印错误消息或终止程序。

现在已经处理了异常/中断和内核。内核可以选择恢复在处理异常/中断之前正在执行的相同进程,或者恢复当前在内存中的任何其他进程的执行。

现在,可以通过从内存中读取和还原所有寄存器值来为所选过程还原CPU的上下文。

选择要恢复的过程必须在停止的同一点恢复。该指令的地址是在中断发生时由机器保存的,因此仅需获取该地址并使CPU继续在该地址执行即可。