第三章:中断
本章概要
操作系统是计算机系统的监管者,必须能对计算机系统状态的突发变化做出反应,这些系统状态可能是程序执行出现异常,或者是突发的外设请求。当计算机系统遇到突发情况时,不得不停止当前的正常工作,应急响应一下,这是需要操作系统来接管,并跳转到对应处理函数进行处理,处理结束后再回到原来的地方继续执行指令。这个过程就是中断处理过程。
中断分类
异常(Exception),指在执行一条指令的过程中发生了错误,此时我们通过中断来处理错误。最常见的异常包括:访问无效内存地址、执行非法指令(除零)、发生缺页等。他们有的可以恢复(如缺页),有的不可恢复(如除零),只能终止程序执行。
陷入(Trap),指我们主动通过一条指令停下来,并跳转到处理函数。常见的形式有通过
ecall
进行系统调用(syscall),或通过ebreak
进入断点(breakpoint)。外部中断(Interrupt),简称中断,指的是 CPU 的执行过程被外设发来的信号打断,此时我们必须先停下来对该外设进行处理。典型的有定时器倒计时结束、串口收到数据等。
外部中断是异步(asynchronous)的,CPU 并不知道外部中断将何时发生。CPU 也并不需要一直在原地等着外部中断的发生,而是执行代码,有了外部中断才去处理。我们知道,CPU 的主频远高于 I/O 设备,这样避免了 CPU 资源的浪费。
本章你将会学到:
- riscv 的中断相关知识
- 中断前后如何进行上下文环境的保存与恢复
- 处理最简单的断点中断和时钟中断。
为何先学习中断?
我们在实现操作系统过程中,会出现各种不可预知的异常错误,且系统一般都会当机(挂了),让开发者不知所措。如果我们实现的 OS 有了中断(包括异常)处理能力,那么在由于某种编程失误产生异常时,OS 能感知到异常,并能提供相关信息(比如异常出现的原因,异常产生的地址等)给开发者,便于开发者修改程序。
另外,中断机制(特别是时钟中断)是实现后续进程切换与调度、系统服务机制等的基础。