📜  中断与异常

📅  最后修改于: 2021-08-25 10:15:23             🧑  作者: Mango

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

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

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

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

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

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

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

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

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

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

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

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

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

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