原创 Linux中软中断机制分析

2008-7-17 09:06 5973 7 11 分类: MCU/ 嵌入式

什么是软中断机制?


       Linux中的软中断机制用于系统中对时间要求最严格以及最重要的中断下半部进行使用。在系统设计过程中,大家都清楚中断上下文不能处理太多的事情,需要快速的返回,否则很容易导致中断事件的丢失,所以这就产生了一个问题:中断发生之后的事务处理由谁来完成?在前后台程序中,由于只有中断上下文和一个任务上下文,所以中断上下文触发事件,设置标记位,任务上下文循环扫描标记位,执行相应的动作,也就是中断发生之后的事情由任务来完成了,只不过任务上下文采用扫描的方式,实时性不能得到保证。在Linux系统和Windows系统中,这个不断循环的任务就是本文所要讲述的软中断daemon。在Windows中处理耗时的中断事务称之为中断延迟处理,在Linux中称之为中断下半部,显然中断上半部处理清中断之类十分清闲的动作,然后在退出中断服务程序时触发中断下半部,完成具体的功能。


       Linux中,中断下半部的实现基于软中断机制。所以理清楚软中断机制的原理,那么中断下半部的实现也就非常简单了。通过上述的描述,大家也应该清楚为什么要定义软中断机制了,一句话就是为了要处理对时间要求苛刻的任务,恰好中断下半部就有这样的需求,所以其实现采用了软中断机制。


<?xml:namespace prefix = o />

 


软中断机制实现原理

      
    软中断机制的实现原理如下图所示:

点击看大图


构成软中断机制的核心元素包括:


1、  软中断状态寄存器soft interrupt stateirq_stat


2、  软中断向量表(softirq_vec


3、  软中断守护daemon


 


软中断的工作工程模拟了实际的中断处理过程,当某一软中断时间发生后,首先需要设置对应的中断标记位,触发中断事务,然后唤醒守护线程去检测中断状态寄存器,如果通过查询发现某一软中断事务发生之后,那么通过软中断向量表调用软中断服务程序action()。这就是软中断的过程,与硬件中断唯一不同的地方是从中断标记到中断服务程序的映射过程。在CPU的硬件中断发生之后,CPU需要将硬件中断请求通过向量表映射成具体的服务程序,这个过程是硬件自动完成的,但是软中断不是,其需要守护线程去实现这一过程,这也就是软件模拟的中断,故称之为软中断。


 


       一个软中断不会去抢占另一个软中断,只有硬件中断才可以抢占软中断,所以软中断能够保证对时间的严格要求。


 


Linux中软中断实现分析


       Linux中最多可以注册32个软中断,目前系统用了6个软中断,他们为:定时器处理、SCSI处理、网络收发处理以及Tasklet机制,这里的tasklet机制就是用来实现下半部的,


 


       描述软中断的核心数据结构为中断向量表,其定义如下:


       struct softirq_action


{


              void (*action)(struct softirq_action *); /* 软中断服务程序 */


              void *data;                                         /* 服务程序输入参数 */


};


 


       软中断守护daemon是软中断机制的实现核心,其实现过程也比较简单,通过查询软中断状态irq_stat来判断事件是否发生,如果发生,那么映射到软中断向量表,调用执行注册的action函数就可以了。从这一点分析可以看出,软中断的服务程序的执行上下文为软中断daemon。在Linux中软中断daemon线程函数为do_softirq()。


 


       触发软中断事务通过raise_softirq()来实现,该函数就是在中断关闭的情况下设置软中断状态位,然后判断如果不在中断上下文,那么直接唤醒守护daemon


 


       常用的软中断函数列表如下:


1、  Open_softirq,注册一个软中断,将软中断服务程序注册到软中断向量表。


2、  Raise_softirq,设置软中断状态bitmap,触发软中断事务。


 


Tasklet机制实现分析

      
        Tasklet
为一个软中断,考虑到优先级问题,分别占用了向量表中的0号和5号软中断。Tasklet机制的实现原理如下图所示:

点击看大图


    当tasklet的软中断事件发生之后,执行tasklet-action的软中断服务程序,该服务程序会扫描一个tasklet的任务列表,执行该任务中的具体服务程序。在这里举一个例子加以说明:


       当用户读写USB设备之后,发生了硬件中断,硬件中断服务程序会构建一个tasklet_struct,在该结构中指明了完成该中断任务的具体方法函数(下半部执行函数),然后将tasklet_struct挂入tasklettasklet_struct链表中,这一步可以通过tasklet_schedule函数完成。最后硬件中断服务程序退出并且CPU开始调度软中断daemon,软中断daemon会发现tasklet发生了事件,其会执行tasklet-action,然后tasklet-action会扫描tasklet_struct链表,执行具体的USB中断服务程序下半部。这就是应用tasklet完成中断下半部实现的整个过程。


 


       Linux中的tasklet实现比较简单,其又封装了一个重要数据结构tasklet_struct,使用tasklet主要函数列表如下:


1、  tasklet_init,初始化一个tasklet_struct,当然可以采用静态初始化的方法,宏为:DECLARE_TASKLET


2、  tasklet_schedule,调度一个tasklet,将输入的tasklet_struct添加到tasklet的链表中。


 


Linux中的软中断机制就是模拟了硬件中断的过程,其设计思想完全可以在其他嵌入式OS中得以应用。


PARTNER CONTENT

文章评论4条评论)

登录后参与讨论

用户1334426 2008-12-16 16:11

软中断时序能够保证 文章写的不错 :)

用户1334426 2008-12-16 16:10

软中断时序能够保证 文章写的不错 :)

用户411565 2008-7-26 14:13

这是我举的一个例子,当USB硬件发生中断之后,执行USB控制器的硬件中断服务程序,在isr中会触发软中断事件。这个软中断事件是USB控制器驱动程序一开始就初始化的。在软中断中完成USB中断的下半部。这个硬件中断服务程序在USB Host driver中,肯定是在内核中。一般我们编写USB设备驱动时,涉及不到这一层,这一层属于硬件抽象层,在设备驱动层的下面,相对比较底层了。以后有时间我会将usb host driver的设计思想写一下。

用户161293 2008-7-25 11:08

有个地方不太明白,“用户读写USB设备之后,发生了硬件中断,硬件中断服务程序会构建一个tasklet_struct”,也就是如果用户要自己定义一个USB的tasklet软中断,实际就是在硬件中断发生后,从硬件中断服务程序中新建软中断,是这样的吗?如果是,这个硬件中断服务程序在什么地方,又如何写?需要修改内核吗?

用户149276 2008-6-19 18:20

怎么下载

用户153739 2008-6-14 08:59

源代码肯定是有的了啊! 不然怎么编译呢?

用户139057 2008-6-12 00:03

有源码吗

用户153739 2008-5-14 10:50

是我经过改编后的图,效果整体感觉还可以的

用户1445264 2008-5-12 19:48

你这好像是PROTEUS里的范例吧,算不得原创,还是要自己做的来看看。
相关推荐阅读
用户411565 2012-12-18 12:58
我的存储之道博客
大家好,最近一直在做存储方面的工作,所以我在51CTO上专门开辟了一个空间讨论存储相关的问题,喜欢存储的朋友可以可以访问我的存储博客: 存储之道 (http://alanwu.blog.51cto...
用户411565 2012-04-06 21:39
SAS Cable可以有多长?
SAS接口是高端硬盘的主流接口,是存储系统的理想选择。我们知道高速信号的传输距离和传输线相关的,那么SAS作为外部通信接口,其Cable线具体可以有多长呢? 我在网上找到上图所示的眼图测...
用户411565 2012-04-06 21:38
对TRIM SCSI命令的一些分析
前一段时间做了一些对SSD方面进行优化的工作,SSD最大的问题在于长时间使用之后,IO性能会急剧下降。其主要问题在于为了防止“写放大”问题的产生,SSD的firmware采用了类似于log方式的算...
用户411565 2012-04-06 21:35
惊叹!我们的跨洋网络
  每次地质自然灾害的时候,总会伴随着网络的问题,这是由于我们的越洋光纤网络出了故障,受到自然力的破坏而导致断裂。越洋光纤,听起来的确是件非常不可思议的事情,工程量非常的巨大,但正是如此伟大的...
用户411565 2012-04-06 21:33
科学仪器网络模型
科学仪器概述     科学仪器发展趋势 科学是从测量开始的,科学仪器是信息技术的源头,是信息产业的重要组成部分,是现代科学与工业的基石。科学仪器产业的发展关系到国家科学研究实力、生...
用户411565 2012-04-06 21:16
谈谈RAID产品与技术
说起RAID,学计算机的同学马上会说RAID技术简单啊,就是将数据条带化,然后计算一些冗余数据,一并写入磁盘。通过RAID技术一方面提高系统的IO性能;另一方面提高系统的可靠性。单纯从RAID的原...
EE直播间
更多
我要评论
4
7
关闭 站长推荐上一条 /3 下一条