概念太多了,信号,软中断,中断等等。试着做总结。
下面这个里面主要讲了硬件中断:
http://www.cnblogs.com/charlesblc/p/6261741.html
下面这个里面主要讲了软中断,硬中断:
http://www.cnblogs.com/charlesblc/p/6263208.html
这里先比较一下异常和中断
参考 http://blog.csdn.net/dodo_check/article/details/8806961
l 中 断(也称硬件中断)
定义:中断是由其他硬件设备依照CPU时钟周期信号随机产生的。
分类: 可屏蔽中断
非可屏蔽中断
来源:间隔定时器和I/O
l 异 常(也称软件中断)
定义:当指令执行时由CPU控制单元产生的。
分类: 处理器探测到的异常
² 故障
² 陷阱
² 异常终止
编程异常(也称软中断)
² int指令
来源: 程序的错误产生的
内核必须处理的异常(例如:缺页和内核服务的请求-int)
异常处理
l 当发生异常时,CPU控制单元产生一个硬件出错码。
l CPU根据该中断吗找到中断向量表内的对应向量,根据该向量转到中断处理程序。
l 中断处理程序处理完之后向当前进程发送一个SIG***信号。
l 若进程定义了相应的信号处理程序则转移到相应的程序执行,若没有,则执行内核定义的操作。
中断处理
l 设备产生中断
l PIC(可编程中断控制器)会产生一个对应的中断向量
l 和中断向量表中的每一个中断向量进行比较,转到对应的中断处理程序
l 中断处理程序进行保存现场,做相关处理,恢复现场
l 内核调度,返回用户进程
硬件中断的上半部和下半部及实现方式
l 硬件中断的分类
² 紧急的 —— 这类中断必须立即执行
² 非紧急的 —— 也必须立即执行
² 非紧急可延迟的 —— 上半部立即执行,下半部延迟执行
硬件中断任务(处理程序)是一个快速、异步、简单地对硬件做出迅速响应并在最短时间内完成必要操作的中断处理程序。硬中断处理程序可以抢占内核任务并且执 行时还会屏蔽同级中断或其它中断,因此中断处理必须要快、不能阻塞。这样一来对于一些要求处理过程比较复杂的任务就不合适在中断任务中一次处理。比如,网卡接收数据的过程中,首先网卡发送中断信号告诉CPU来取数据,然后系统从网卡中读取数据存入系统缓冲区中,再下来解析数据然后送入应用层。这些如果都让中断处理程序来处理显然过程太长,造成新来的中断丢失。因此Linux开发人员将这种任务分割为两个部分,一个叫上底,即中断处理程序,短平快地处理与硬 件相关的操作(如从网卡读数据到系统缓存);而把对时间要求相对宽松的任务(如解析数据的工作)放在另一个部分执行,这个部分就是我们这里要讲的下半底。
下半底是一种推后执行任务,它将某些不那么紧迫的任务推迟到系统更方便的时刻运行。因为并不是非常紧急,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。内核中实现 下半底的手段经过不断演化,目前已经从最原始的BH(bottom half)演生出BH、任务队列(Task queues)、软中断(Softirq)、Tasklet、工作队列(Work queues)(2.6内核中新出现的)。
其中的软中断和异常中提到的软中断不一样的(后者特指对硬中断的模拟):
前者主要是用来处理非紧急可延迟的硬件中断,是Linux系统定定义的,不是用户定义,并且个数有限
关于软中断和硬中断的其它解析(上面提到的int指令模拟中断):
软中断一般是指由指令int引起的“伪”中断动作——给CPU制造一个中断的假象;而硬中断则是实实在在由8259的连线触发的中断。因此,严格的 讲,int与IRQ毫无关系,但二者均与中断向量有关系。int引起的中断,CPU是从指令中取得中断向量号;而IRQ引起的中断,CPU必须从数据线上取回中断号,接下来CPU的工作就一样了:保护现场、根据中断号得到中断处理程序地址、执行中断处理、恢复现场继续执行被中断的指令。
在软中断(模拟中断)和硬中断之间的区别是什么?
①硬中断是由外部事件引起的因此具有随机性和突发性;软中断是执行中断指令产生的,无面外部施加中断请求信 号,因此中断的发生不是随机的而是由程序安排好的。
②硬中断的中断响应周期,CPU需要发中断回合信号(NMI不需要),软中断的中断响应周 期,CPU不需发中断回合信号。
③硬中断的中断号是由中断控制器提供的(NMI硬中断中断号系统指定为02H);软中断的中断号由指令直接给出, 无需使用中断控制器。
④硬中断是可屏蔽的(NMI硬中断不可屏蔽),软中断不可屏蔽。
这里比较一下信号和中断
先接上面这篇参考文章的内容:
信号是异步的进程间通讯机制,是在软件层次上对中断机制的一种模拟
l 产生信号的条件主要有:
1. 用户在终端 按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C产生SIGINT信 号,Ctrl-/产生SIGQUIT信号,Ctrl-Z产生SIGTSTP信号。 2. 硬件异常产生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了 除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释为SIGFPE信号发送给进 程。再比如当前进程访问了非法内存地址,,MMU会产生异常,内核将这个异常解释为SIGSEGV信 号发送给进程。 3. 一个进程调用kill(2)函数可以发送信 号给另一个进程。 4. 可以用kill(1)命令发送信号给某个 进程,kill(1)命令也是调用kill(2)函 数实现的,如果不明确指定信号则发送SIGTERM信号,该信号的默认处理动作是终止进程。 5. 当 内核检测到某种软件条件发生时也可以通过信号通知进程,例如闹钟超时产生SIGALRM信 号,向读端已关闭的管道写数据时产生SIGPIPE信号。
下图为异常和函数产生信号的方式以及进程的处理过程
另,参考 http://www.cnblogs.com/lcw/p/3235994.html
信号与中断的相似点
(1)采用了相同的异步通信方式;
(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;
(3)都在处理完毕后返回到原来的断点;
(4)对信号或中断都可进行屏蔽。
信号与中断的区别
(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;
(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;
(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。
信号机制
(1)发送信号。发送信号的程序用系统调用kill( )实现;
(2)预置对信号的处理方式。接收信号的程序用signal( )来实现对处理方式的预置;
(3)收受信号的进程按事先的规定完成对相应事件的处理。
对信号的处理
当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返回用户态时,核心都要检查该进程是否已收到软中断。当进程处于核心态时,即使收到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号。对软中断信号的处理分三种情况进行:
(1)如果进程收到的软中断是一个已决定要忽略的信号(function=1),进程不做任何处理便立即返回;
(2)进程收到软中断后便退出(function=0);
(3)执行用户设置的软中断处理程序。
http://blog.csdn.net/c453787298/article/details/18004261
中断:
中断更倾向于硬件,外部设备状态变化时发送给cup的一个信号,但是cpu如何捕捉这样的一个信号呢,原来cpu的控制单元会检查在执行前一条指令的过程中是否有中断或异常发生。当捕捉到这样一个信号后,便开始立即执行do_irq()函数,执行相应的中断处理程序(上半部),从cpu开始处理中断至此,cpu对于其他的中断都是不处理的,上半部主要负责一些要紧但是不耗时的操作,后来的操作便由下半部来处理。对于上半部如何与下半部联系起来,便是用接下来要说的软中断了。
软中断:
软中断是内核的一种机制,模拟硬中断(即上面所说的中断)的实现,既然是对中断的模拟,对于某个软中断向量便会有对应的软中断处理函数,对于多核cpu(SMP),存在这样的规则,哪个cpu触发的软中断,便由哪个cpu来执行相应的中断程序,中断处理程序(包括上半部和下半部)没有自己的堆栈,执行的时候都是使用的当前用户进程的内核栈,若当前没有用户进程,便使用idle进程的内核栈。软中断处理程序的执行在某一个cpu(多核中的一个)上应是线性的,只有上一个软中断处理完成之后才能执行下一个软中断处理程序。
信号:
信号应该就是进程对内核软中断的一种模拟了,主要用于进程之间的信息的传递,触发的相应的处理函数在进程的用户空间里执行。