【转】中断的作用

来源:CSDN

链接:http://blog.csdn.net/keyue123/article/details/16959111

所有的事物都是依靠中断来解决问题的。计算机更是如此,依靠时钟发生器,人为的设置没几个时钟周期做一个任务,不管是否做完,一旦规定的时间到了,那么就要强制“中断”,以作下一个任务……就这样,直道所有的任务都作过了(但不一定都做完毕),再接着做第一个没有做完的任务,就这样走而复始循环工作。完成所谓的“多任务”。
要不然,一个cpu,如果即能一边打字,一边看到屏幕呢?这就是一个cpu核心,不断地一会检测键盘,一会检测屏幕……
还有就是软中断,具体详细的细节,可以参考微机原理。

中断系统


中断装置和中断处理程序统称为中断系统

中断系统是计算机的重要组成部分。实时控制、故障自动处理、计算机与外围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率。

不同的计算机其硬件结构和软件指令是不完全相同的,因此,中断系统也是不相同的。计算机的中断系统能够加强CPU对多任务事件的处理能力。中断机制是现代计算机系统中的基础设施之一,它在系统中起着通信网络作用,以协调系统对各种外部事件的响应和处理。中断是实现多道程序设计的必要条件。中断是CPU对系统发生的某个事件作出的一种反应。引起中断的事件称为中断源。中断源向CPU提出处理的请求称为中断请求。发生中断时被打断程序的暂停点成为断点。CPU暂停现行程序而转为响应中断请求的过程称为中断响应。处理中断源的程序称为中断处理程序。CPU执行有关的中断处理程序称为中断处理。而返回断点的过程称为中断返回。中断的实现实行软件和硬件综合完成,硬件部分叫做硬件装置,软件部分成为软件处理程序。

中断系统的功能

1)实现中断响应和中断返回
当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急、更重要的工作,则在执行完当前指令后响应这一中断请求。CPU中断响应过程如下:首先,将断点处的PC值(即下一条应执行指令的地址)推入堆栈保留下来,这称为保护断点,由硬件自动执行。然后,将有关的寄存器内容和标志位状态推入堆栈保留下来,这称为保护现场,由用户自己编程完成。保护断点和现场后即可执行中断服务程序,执行完毕,CPU由中断服务程序返回主程序,中断返回过程如下:首先恢复原保留寄存器的内容和标志位的状态,这称为恢复现场,由用户编程完成。然后,再加返回指令RETI,RETI指令的功能是恢复PC值,使CPU返回断点,这称为恢复断点。恢复现场和断点后,CPU将继续执行原主程序,中断响应过程到此为止。

2)实现优先权排队
通常,系统中有多个中断源,当有多个中断源同时发出中断请求时,要求计算机能确定哪个中断更紧迫,以便首先响应。为此,计算机给每个中断源规定了优先级别,称为优先权。这样,当多个中断源同时发出中断请求时,优先权高的中断能先被响应,只有优先权高的中断处理结束后才能响应优先权低的中断。计算机按中断源优先权高低逐次响应的过程称优先权排队,这个过程可通过硬件电路来实现,亦可通过软件查询来实现。

3)实现中断嵌套
当CPU响应某一中断时,若有优先权高的中断源发出中断请求,则CPU能中断正在进行的中断服务程序,并保留这个程序的断点(类似于子程序嵌套),响应高级中断,高级中断处理结束以后,再继续进行被中断的中断服务程序,这个过程称为中断嵌套。如果发出新的中断请求的中断源的优先权级别与正在处理的中断源同级或更低时,CPU不会响应这个中断请求,直至正在处理的中断服务程序执行完以后才能去处理新的中断请求。

中断、异常和系统调用

所谓中断是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的程序,保留现场后自动地转去执行相应的处理程序,处理完该事件后再返回断点继续执行被“打断”的程序。

中断可分为三类,第一类是由CPU外部引起的,称作中断,如I/O中断、时钟中断、控制台中断等。第二类是来自CPU的内部事件或程序执行中的事件引起的过程,称作异常,如由于CPU本身故障(电源电压低于105V或频率在47~63Hz之外)、程序故障(非法操作码、地址越界、浮点溢出等)等引起的过程。

第三类由于在程序中使用了请求系统服务的系统调用而引发的过程,称作“陷入”(trap,或者陷阱)。前两类通常都称作中断,它们的产生往往是无意、被动的,而陷入是有意和主动的。

1.中断处理

中断处理一般分为中断响应和中断处理两个步骤。中断响应由硬件实施,中断处理主要由软件实施。

(1)中断响应

对中断请求的整个处理过程是由硬件和软件结合起来而形成的一套中断机构实施的。发生中断时,CPU暂停执行当前的程序,而转去处理中断。这个由硬件对中断请求作出反应的过程,称为中断响应。一般说来,中断响应顺序执行下述三步动作:

◆中止当前程序的执行;

◆保存原程序的断点信息(主要是程序计数器PC和程序状态寄存器PS的内容);

◆从中断控制器取出中断向量,转到相应的处理程序。

通常CPU在执行完一条指令后,立即检查有无中断请求,如果有,则立即做出响应。

当发生中断时,系统作出响应,不管它们是来自硬件(如来自时钟或者外部设备)、程序性中断(执行指令导致“软件中断”—SoftwareInterrupts),或者来自意外事件(如访问页面不在内存)。

如果当前CPU的执行优先级低于中断的优先级,那么它就中止对当前程序下条指令的执行,接受该中断,并提升处理机的执行级别(一般与中断优先级相同),以便在CPU处理当前中断时,能屏蔽其它同级的或低级的中断,然后保存断点现场信息,通过取得的中断向量转到相应的中断处理程序的入口。

(2)中断处理

CPU从中断控制器取得中断向量,然后根据具体的中断向量从中断向量表IDT中找到相应的表项,该表项应是一个中断门。于是,CPU就根据中断门的设置而到达了该通道的总服务程序的入口。

核心对中断处理的顺序主要由以下动作完成:

◆保存正在运行进程的各寄存器的内容,把它们放入核心栈的新帧面中。

◆确定“中断源”或核查中断发生,识别中断的类型(如时钟中断或盘中断)和中断的设备号(如哪个磁盘引起的中断)。系统接到中断后,就从机器那里得到一个中断号,它是检索中断向量表的位移。中断向量因机器而异,但通常都包括相应中断处理程序入口地址和中断处理时处理机的状态字。

◆核心调用中断处理程序,对中断进行处理。

◆中断处理完成并返回。中断处理程序执行完以后,核心便执行与机器相关的特定指令序列,恢复中断时寄存器内容和执行核心栈退栈,进程回到用户态。如果设置了重调度标志,则在本进程返回到用户态时做进程调度。

2.系统调用

在Unix/Linux系统中,系统调用像普通C函数调用那样出现在C程序中。但是一般的函数调用序列并不能把进程的状态从用户态变为核心态,而系统调用却可以做到。

C语言编译程序利用一个预先确定的函数库(一般称为C库),其中有各系统调用的名字。C库中的函数都专门使用一条指令,把进程的运行状态改为核心态。Linux的系统调用是通过中断指令“INT0x80”实现的。

每个系统调用都有惟一的号码,称作系统调用号。所有的系统调用都集中在系统调用入口表中统一管理。

系统调用入口表是一个函数指针数组,以系统调用号为下标在该数组中找到相应的函数指针,进而就能确定用户使用的是哪一个系统调用。不同系统中系统调用的个数是不同的,目前Linux系统中共定义了221个系统调用。

另外,系统调用表中还留有一些余项,可供用户自行添加。

当CPU执行到中断指令“INT0x80”时,硬件就做出一系列响应,其动作与上述的中断响应相同。CPU穿过陷阱门,从用户空间进入系统空间。相应地,进程的上下文从用户堆栈切换到系统堆栈。

接着运行内核函数system_call()。首先,进一步保存各寄存器的内容;接着调用syscall_trace(),以系统调用号为下标检索系统调用入口表sys_call_table,从中找到相应的函数;然后转去执行该函数,完成具体的服务。

执行完服务程序,核心检查是否发生错误,并作相应处理。如果本进程收到信号,则对信号作相应处理。最后进程从系统空间返回到用户空间。

上面两讲简要介绍了Linux内核的主要数据结构和相应的算法。Linux内核包含了丰富的内容,这里仅是其中的一点点,以求起到“抛砖引玉”的作用。

信号的中断与系统调用的重起

#include <signal.h>

int sigaction(ints signo, const structsigaction *act, struct sigaction *oact) ;

struct sigaction {

void(*sa_handler)(); /* addr of signal handler, or SIG_IGN, or SIG_DFL*/

sigset_t sa_mask; /* additional signals to block */

intsa_flags; /* signal options*/

} ;

当更改信号动作时,如果sa_handler指向一个信号捕捉函数(不是常数SIG_IGN或SIG_DFL),则sa_mask字段说明了一个信号集,在调用信号捕捉函数之前,该信号集要加到进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字恢复为原先值。这样,在调用信号处理程序时就能阻塞某些信号。在信号处理程序被调用时,系统建立的新信号屏蔽字会自动包括正被递送的信号。因此保证了在处理一个给定的信号时,如果这种信号再次发生,那么它会被阻塞到对前一个信号的处理结束为止。A.可自动重起的signal()的实现:

#include <signal.h>

#typpdef voidSigfunc(int signo);

Sigfunc *signal(int signo, Sigfunc *func){

struct sigaction act, oact;

act.sa_handler = func;

sigemptyset(act.sa_mask);

act.sa_flags = 0;

if (signo == SIGALRM){

#ifdef SA_INTTERRUPT //SUNOS act.flags |= SA_INTTERRUPT;

#endif }

else // for other signal {#ifdef SA_RESTART //SVR, 4.3+BSD act.flag|= SA_RESTART; #endif }

if (sigaction(signo, &act, &oac)< 0)

return (SIG_ERR);

return (oact.sa_handler);

}

注:在if语句中,我们检查是否为SIGALRM信号,如果是,且系统定义了SA_INTERRUPT(SUNOS),即为SUNOS,该系统默认的系统调用是自动重起的,我们阻止该信号中断的系统调用重起,因为我们要用该信号中断I/O操作,实现定时的功能.接着的else语句中的信号为SIGALRM之外的其他信号,且系统定义了SA_RESTART,即为SVR4或4.3+BSD类系统,该类系统中默认的系统调用是不可重起的,所以应该加上SA_RESTART标志,使由这些信号中断的系统调用自动重起.B.不可重起的signal_intr()实现: Sigfunc *signal_intr(int signo,Sigfunc *func)

{
struct sigaction act, oact;

act.sa_handler = func;
sigemptyset(act.sa_mask);
act.sa_flags = 0;

#ifdef SA_INTTERRUPT //SUNOS
act.flags |= SA_INTTERRUPT;
#endif
if (sigaction(signo, &act, &oac) < 0)
return (SIG_ERR);

return (oact.sa_handler);
}
注:只有SUNOS为自动重起的,其他为不自动重起的,所以只要将SUNOS标志为非自动重起即可.如上.

时间: 2024-10-06 22:13:28

【转】中断的作用的相关文章

中断的作用

1. 什么叫中断?有哪几种不同类型的中断? 由于某个事件的发生,CPU暂停当前正在执行的程序,转而执行处理该事件的一个程序.该程序执行完成后,CPU接着执行被暂停的程序.这个过程称为中断. 根据中断源的位置,有两种类型的中断.有的中断源在CPU的内部,称为内部中断.大多数的中断源在CPU的外部,称为外部中断. 根据中断引脚的不同,或者CPU响应中断的不同条件,也可以把中断划分为可屏蔽中断和不可屏蔽中断两种.    2. 什么是中断类型?它有什么用处? 用若干位二进制表示的中断源的编号,称为中断类

IMX257实现GPIO-IRQ中断按键驱动程序

IMX257实现GPIO-IRQ中断按键驱动程序 2015-02-18 李海沿 ????昨天我们已经实现了中断查询的方式实现GPIO按键驱动程序,但是,有一个缺点就是,当我们把应用程序放在后台执行时,即便没有按键,应用程序while循环中的read函数也不断的在运行,严重的导致了CPU资源的浪费. ????本文中,我们在前面按键查询驱动程序的基础上来修改. ????大概介绍一下设计思路吧: ????和前面的差不多,当我们加载驱动时,首先在init函数中,对GPIO功能进行模式设置,都设置为GPI

计算机的中断

计算机中断 (一)中断是指CPU在运行时接收到硬件发出的请求,CPU保存当前进程的相关信息,然后处理这个请求,根据中断类型号找到中断向量,执行相应的中断程序,然后恢复之前的进程信息,继续执行之前的进程. (二)中断系统作用: 1.故障检测和自动处理   程序执行出现异常如溢出可以通过中断处理 2.实时信息处理     实时信息处理中需要对信息做实时处理,采用中断可以完成 3.并行操作   多个外部设备可以与CPU并行操作,提高系统的效率 4.分时处理  多道程序运行时,可以使用定时和中断,把CP

中断技术

中断技术是一种使CPU中止正在执行的程序而转去处理特殊事件的操作. 什么叫中断? 编辑 这些引起中断的事件称为中断源,它们可能是来自外设的输入输出请求,也可能是计算机的一些异常事故或其它内部原因. 更具体地,我们定义CPU中断为这样一个过程:在特定的事件(中断源,也称中断请求信号)触发下引起CPU暂停正在运行的程序(主程序),转而先去处理一段为特定事件而编写的处理程序(中断处理程序),等中断处理程序处理完成后,再回到主程序被打断的地方继续运行. 中断的作用 编辑 一方面,有了中断功能,PC系统就

非常好!!!Linux源代码阅读——中断【转】

Linux源代码阅读——中断 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/2_int.html 目录 为什么要有中断 中断的作用 中断的处理原则 Linux 中断机制 中断控制器 中断描述符 中断数据结构 中断的初始化 内核接口 中断处理过程 CPU 的中断处理流程 保存中断信息 处理中断 从中断中返回 编写中断处理程序 软中断.tasklet与工作队列 上半部与下半部 软中断 tasklet 工作队列 1 为什么要有中断 1.1 中

性能分析_linux服务器CPU_中断

中断 1.  指标范围 1.1  Interrupt rate 应该与cpu利用率结合分析,如果cpu利用率在合理范围内,大量的中断也是可以接受的.一个巨大的中断值,同时伴随着缓慢的系统性能表现,指示存在硬件问题 1.2  Context Switch Rate 应该与cpu利用率结合分析,如果cpu利用率在合理范围内,大量的中断也是可以接受的. 当每次调用引起的上下文切换大于等于4时,需要结合分析 网上也有说,需要少于5000*cpu个数 2.  概念说明 CPU 是一种硬件资源,和任何其他硬

异步事件:轮询与中断

CPU几乎把所有的时间都花费在从内存获取指令并运行它们的过程中.然而,CPU和主存仅仅只是计算机硬件系统中众多组件的其中两个.一个完整的系统还包含其他的设备,比如: 硬盘或者固态硬盘,用来存储程序和数据文件的.(注意,主存仅保存少量的信息,并且只有在计算机接通电源的时候才能保存信息.硬盘或者固态硬盘用来永久存储大量的信息.但是在程序真正运行前,程序必须把硬盘或者固态硬盘里的数据加载到主存中.硬盘把数据存储在旋转磁盘中(spinning magnetic disk),而固态硬盘把数据存储在纯粹的电

9.4 中断的处理过程

计算机组成 9 中断和异常 9.4 中断的处理过程 那我们现在可以放心大胆地进行运算了.算,算,算,一旦遇到了一个异常情况,我们就根据这个异常情况的类型,去查找这个手册最前面的表格.假如我们遇到的可能是第四种类型,我们找到第四条,上面写着操作方法在第十二页.翻到第十二页,好,找到了.那么按照这个操作方法一步一步往下执行,就把这问题给解决了.然后呢,我们就可以继续刚才的运算了,对不对?可是我刚才是在哪一页进行的运算?这在哪儿呢?我怎么回到刚才的运算呢? 我们先来看一看在CPU内部是如何检测中断的.

操作系统:中断和异常

中断的作用:中断会使CPU由用户态变为内核态,使操作系统重新夺回对CPU的控制权. 内核态 -> 用户态:执行一条特权指令 --- 修改PSW的标志位为"用户态",这个动作意味着操作系统将主动让出CPU使用权. 用户态 -> 内核态:由中断引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU使用权. 中断的类型: 内中断:与当前执行的指令有关,中断信号来源于CPU内部. 外中断:与当前执行的指令无关,中断信号来源于CPU外部. 中断的分类: 内中断(异常)