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

1、参考

Unix内核源码剖析异步

2、名词解释

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

3、正文

3.1 引言

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

3.2 中断和陷入定义

3.2.1 中断

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

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

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

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

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 发生中断或者陷入

相关文章
相关标签/搜索