一、参考
二、名词解释
psw: 状态寄存器
pc: r7, 通用寄存器r7, 程序计数器,从r7寄存器指示的内存地址中读取指令,解释并且执行该指令,处理完成后r7将指向容纳下一条指令的内存地址
三、正文
3.1 引言
周边设备发出的请求以及CPU内部特定的事件,以中断或者陷入的形式加以处理。
执行中的进程将暂停运行,转而处理发生的中断或者陷入,等待处理完成后,再继续运行被暂停的进程。
系统调用通过陷入机制实现。
3.2 中断和陷入定义
3.2.1 中断
当周边设备发出请求时候,暂停执行中的进程,转而执行与请求相对应的处理。等待处理完成后再恢复被暂停的进程。对中断请求进行处理的函数称为中断处理函数
中断请求类型:
(1)块设备处理完成通知
(2)终端输入
(3)时钟中断
如果没有中断的机制,提出请求的进程必须定期检查是否发出了处理结束的通知,这种方式称为轮询。与处理器相比,周边设备的处理速度比较慢,轮询花费的时间变长。
中断是一种对进程运行和异步事件进行高效处理的机制。
中断处理函数由内核进程负责执行,在运行用户进程时候发生中断的场景,通过硬件切换到内核进程。
被中断的进程的数据暂存于内核栈之中。当中断处理函数结束后,将恢复内核栈中的数据,继续处理被中断的进程。
3.2.2 陷入
陷入和中断相同点:都会引起执行进程的暂停和恢复处理
不同点:陷入是由CPU内部事件引起的
当程序执行发生了异常时候,设置PSW的陷入位,表示陷入被触发。
异常情况:
(1)被0除
(2)访问了未被分配的区域
(3)总线超时
因为存在陷入机制,所以用户程序不必每次都确认异常情况,或者逐一处理。当异常出现时候,会触发陷入,自动执行共用的处理。当某种陷入发生时候,如果希望在对其进行适当的处理后继续原有的操作,可以定义独自的陷入处理函数来实现。
由内核进程触发的陷入,通常由独自定义的陷入处理函数处理,内核程序在执行可能会触发陷入的指令之前,将变量nofault
设定为与此陷入相对应的处理函数的地址,当陷入发生时候,nofault
指向的处理函数将自动运行。
用户程序触发的陷入最终作为信号被处理。通过对信号设定处理函数,在异常发生时候可以进行独自处理。
系统调用:用户执行汇编器的sys
指令后触发表示系统调用的陷入,系统调用存在多种类型,通过sys
指令的第一个参数指定,有的系统调用还带有自己的参数,参数的指定方法因为系统调用种类的不同而不同。sys
指令为汇编器的模拟指令,实际触发陷入机制的指令为trap
, 指令的低位比特含有表示陷入种类的值,汇编器将sys
指令和第一个参数,编码为trap
指令。
从用户进程切换到内核进程并且进行相应处理的过程,都是利用陷入实现的。
3.3 优先级和向量
中断含有0到7的中断优先级,当PSW中的处理器优先级大于或者等于中断优先级时候,中断不会被处理。
周边设备将持续发出中断请求,直到处理器优先级下降,该中断得到处理。
(注:中断优先级数值越大,表示处理器将越有可能执行该中断事件)
处理器优先级可以通过spln()
函数进行变更spl0~spl7
执行中断处理函数时候,处理器优先级被设置为中断优先级的值,在处理过程中也可以提高处理器优先级。
但是,用小于中断优先级执行中断处理函数会导致一些问题。
在运行中断处理函数时候,如果再次收到相同类型的中断请求,中断与由中断处理引起的副作用在发生的顺序上,会出现逆转。如下:
陷入的优先级相当于中断优先级的8, 无论当前处理器的优先级的值是多少,当发生陷入时候,都会马上得到处理。
中断和陷入向量是一些预设的PSW的值和pc值的存放地址。内核进程在开始处理中断和陷入时候会使用这些预设值设置PSW和pc寄存器。
3.4 中断和陷入处理流程
中断和陷入由发生到处理结束基本遵循相同的处理流程:
(1)中断或者陷入发生;
(2)将当前的PSW和pc保存于内核栈;
(3)从向量指定的地址读取PSW和pc;
(4)执行call或者trap;
(5)执行中断处理函数或者陷入处理函数;
(6)从内核栈中恢复PSW和pc