unix内核源码剖析【5. 中断与陷入】

一、参考

Unix内核源码剖析

二、名词解释

psw: 状态寄存器
pc: r7, 通用寄存器r7, 程序计数器,从r7寄存器指示的内存地址中读取指令,解释并且执行该指令,处理完成后r7将指向容纳下一条指令的内存地址

三、正文

3.1 引言

周边设备发出的请求以及CPU内部特定的事件,以中断或者陷入的形式加以处理。
执行中的进程将暂停运行,转而处理发生的中断或者陷入,等待处理完成后,再继续运行被暂停的进程。
系统调用通过陷入机制实现。

3.2 中断和陷入定义

3.2.1 中断

当周边设备发出请求时候,暂停执行中的进程,转而执行与请求相对应的处理。等待处理完成后再恢复被暂停的进程。对中断请求进行处理的函数称为中断处理函数

中断请求类型:
(1)块设备处理完成通知
(2)终端输入
(3)时钟中断

如果没有中断的机制,提出请求的进程必须定期检查是否发出了处理结束的通知,这种方式称为轮询。与处理器相比,周边设备的处理速度比较慢,轮询花费的时间变长。

中断是一种对进程运行和异步事件进行高效处理的机制。

image.png

image.png

中断处理函数由内核进程负责执行,在运行用户进程时候发生中断的场景,通过硬件切换到内核进程。

被中断的进程的数据暂存于内核栈之中。当中断处理函数结束后,将恢复内核栈中的数据,继续处理被中断的进程。

3.2.2 陷入

陷入和中断相同点:都会引起执行进程的暂停和恢复处理
不同点:陷入是由CPU内部事件引起的

当程序执行发生了异常时候,设置PSW的陷入位,表示陷入被触发。
异常情况:
(1)被0除
(2)访问了未被分配的区域
(3)总线超时

因为存在陷入机制,所以用户程序不必每次都确认异常情况,或者逐一处理。当异常出现时候,会触发陷入,自动执行共用的处理。当某种陷入发生时候,如果希望在对其进行适当的处理后继续原有的操作,可以定义独自的陷入处理函数来实现。

由内核进程触发的陷入,通常由独自定义的陷入处理函数处理,内核程序在执行可能会触发陷入的指令之前,将变量nofault设定为与此陷入相对应的处理函数的地址,当陷入发生时候,nofault指向的处理函数将自动运行。

用户程序触发的陷入最终作为信号被处理。通过对信号设定处理函数,在异常发生时候可以进行独自处理。

系统调用:用户执行汇编器的sys指令后触发表示系统调用的陷入,系统调用存在多种类型,通过sys指令的第一个参数指定,有的系统调用还带有自己的参数,参数的指定方法因为系统调用种类的不同而不同。sys指令为汇编器的模拟指令,实际触发陷入机制的指令为trap, 指令的低位比特含有表示陷入种类的值,汇编器将sys指令和第一个参数,编码为trap指令。

从用户进程切换到内核进程并且进行相应处理的过程,都是利用陷入实现的。

3.3 优先级和向量

中断含有0到7的中断优先级,当PSW中的处理器优先级大于或者等于中断优先级时候,中断不会被处理。
周边设备将持续发出中断请求,直到处理器优先级下降,该中断得到处理。
(注:中断优先级数值越大,表示处理器将越有可能执行该中断事件)

image.png

处理器优先级可以通过spln()函数进行变更spl0~spl7

image.png

执行中断处理函数时候,处理器优先级被设置为中断优先级的值,在处理过程中也可以提高处理器优先级。
但是,用小于中断优先级执行中断处理函数会导致一些问题。
在运行中断处理函数时候,如果再次收到相同类型的中断请求,中断与由中断处理引起的副作用在发生的顺序上,会出现逆转。如下:
image.png

陷入的优先级相当于中断优先级的8, 无论当前处理器的优先级的值是多少,当发生陷入时候,都会马上得到处理。

中断和陷入向量是一些预设的PSW的值和pc值的存放地址。内核进程在开始处理中断和陷入时候会使用这些预设值设置PSW和pc寄存器。

image.png

3.4 中断和陷入处理流程

image.png

中断和陷入由发生到处理结束基本遵循相同的处理流程:
(1)中断或者陷入发生;
(2)将当前的PSW和pc保存于内核栈;
(3)从向量指定的地址读取PSW和pc;
(4)执行call或者trap;
(5)执行中断处理函数或者陷入处理函数;
(6)从内核栈中恢复PSW和pc

3.4.1 发生中断或者陷入