分类
外中断处理过程#
当外中断出现时,CPU 执行至中断周期,检测到中断发生
** 关中断:**CPU 会立即停止正在执行的指令,屏蔽中断。
** 保存断点:**CPU 将当前的上下文(寄存器状态、程序计数器等)保存到内存或特定的中断上下文保存区域。这个过程是由 CPU 自动完成的。
中断向量定位(中断服务寻址):
CPU 根据总线上的中断向量信号查找中断向量表。这是一个预定义的数据结构,其中包含了各种中断类型对应的处理程序的入口地址。
CPU 通常会在硬件级别上管理这个查找过程。当中断发生时,CPU 会使用中断类型(可能是中断编号或其他标识)作为索引来访问中断向量表。这个查找操作在硬件电路中实现,无需操作系统直接参与。CPU 根据中断类型从中断向量表中获取相应的中断处理程序的入口地址,然后跳转到该地址执行中断处理。此时即开始了中断处理程序的执行
保存现场和屏蔽字:
在中断处理程序接管之后,它还需要保存一些现场和屏蔽字,比如通用寄存器组。
** 开中断:** 此时中断处理程序再次打开中断,可以被更高级中断打断
中断处理程序执行
** 关中断:** 中断处理程序执行完成之后,准备恢复 CPU 状态到原程序,需要关闭中断
** 恢复现场和屏蔽字:** 从栈中弹出现场和屏蔽字内容。
** 开中断:** 状态恢复完成后,开启中断
中断返回:CPU 恢复正常的执行流程,继续执行被中断的程序或其他任务
#
异常处理过程
当异常发生时,CPU 会自动保存当前程序的状态,包括程序计数器(PC)、标志寄存器(FLAGS)和其他相关寄存器。
查找中断向量表进行中断向量定位。根据中断向量表中的类型判断是否关闭中断(操作中断屏蔽位)。
控制权交给中断处理程序。
一般来说,CPU 在响应中断时,会自动保存一些最基本的寄存器和标志位,以便在中断处理程序返回时恢复被中断的进程。但是,CPU 不会保存所有的寄存器和标志位,因为这样做可能会浪费时间和空间,而且有些寄存器和标志位可能在中断处理程序中不会被修改或者不需要恢复。因此,中断处理程序需要根据具体的情况,来决定是否要保存和恢复其他的寄存器和标志位。这样做可以提高中断处理的效率和灵活性。
中断处后返回。
系统调用过程
- 首先,用户程序会通过一个库函数或者一个 API 来请求一个系统服务。这个库函数或者 API 会将用户程序的参数和请求的服务编号放在 CPU 的寄存器或者栈中
- 然后,用户程序会执行一个特殊的指令,通常是一个中断指令,来通知操作系统内核有一个系统调用请求。
- 接着,CPU 会响应这个中断指令,将当前的程序状态保存在栈中,并且切换到内核态。
- 然后,CPU 会跳转到一个预定义的地址,开始执行操作系统内核的代码。
- 接着,操作系统内核会根据寄存器或者栈中的服务编号,找到对应的系统调用处理程序,并且调用它。
- 然后,系统调用处理程序会执行相应的操作,比如访问硬件设备、创建进程、分配内存等,并且将结果返回给用户程序。
- 最后,操作系统内核会从栈中恢复用户程序的状态,并且切换回用户态,然后返回控制权给用户程序。