陷入 (Trap)、中断 (Interrupt) 与异常 (Exception)
前面的操作系统介绍中,我们知道 RISCV 根据不同的需求,设计了一套同步和一套异步的特权级切换机制。这里我们会解释一下这两种切换机制(但不会对具体细节进行过多地阐释,具体细节会在后面的文档中慢慢介绍)。
注:陷入、中断、异常三个概念在不同的地方有不同的含义。我们这里只是在 RISCV 语境下的含义。
中断 (Interrupt) 是异步的特权级切换机制,绝大多数情况下与 CPU 当前指令的执行无关。发生中断时,CPU 会停止当前指令的执行,转到指定的处理指令处,开始执行处理函数。中断可以被暂时关闭,关闭时 CPU 不会停止当前指令的执行。
异常 (Exception) 是同步的特权级切换机制,与 CPU 当前指令的执行有关。异常可以是主动发起的,也可以是访问了非法地址等错误导致的,或者是碰到了之前设置的断点而触发的。异常是无法被关闭的,一旦发生,就一定会跳转到指定的异常处理指令,开始自行处理函数。
陷入 (Trap) 是指异常和中断的统称。
不同机制的应用场景
当我们的应用需要向内核申请使用某种未获得资源时,就需要主动地发起一次进入内核的请求,这个过程通常是同步的,也就是我们说的「异常」。
不过,当我们想要在特定时间点切换运行的任务时,我们不能让应用主动在特定的时间交出运行的权利,因为应用如果不交出,其可以一直占用 CPU。这时,我们需要使用异步的时钟中断机制。时钟中断机制会在硬件层面打破应用的运行(用户态是无法关闭中断的),并将控制权交给内核。
上面的两个例子分别是「异常」和「中断」的应用场景。