linux内核研究-4-软中断

来源:互联网 发布:工业无线传感器网络 编辑:程序博客网 时间:2024/06/05 21:04

linux内核研究-4-软中断

1,说在前面
1》此“软中断”非彼“软中断”,这里说的不是针对硬件中断的那个,而是中断处理流程的下半部分机制之一。
2》2.6内核有三种下半部机制:软中断,tasklet,work queue。
3》老的内核使用的BH,task queue,现在都已经不用了。
4》tasklet 需要软中断的帮助。
5》软中断不能抢占其它软中断,但是不同CPU上的可以同时执行。
6》软中断只能被中断抢占。
7》要用软中断,需要在内核编译前做一些事情,不能完全动态创建。

2,软中断工作原理和过程
1》内核里有一个32个成员的数组。
数组成员包含软中断处理函数指针,和处理函数的参数。在/kernel/softirq.c里面。
static struct softirq_action softirq_vec[32] _xx__xx。
(我们公司有套加密系统,从source insight里面不能直接copy,必须手输,所以就把后面的变量名称省掉了,见谅。),这个数组的成员定

义在interrupt.h里面:

struct softirq_action
{
void (*action)(struct softirq_action*);
void *data;
}


2》内核里面有个内核线程(叫:ksoftirqd)。

 

3,软中断工作流程
1》ksoftirqd循环检查32位数组。
2》发现某一位被标记,就执行它对应的软中断处理函数。

4,在驱动中如何使用软中断
1》请确认一定要用软中断(或许可以考虑tasklet,呵呵)。
2》在内核编译前,分配索引:
在linux/interrupt.h里面的232行有个枚举,在里面加入一行(比如叫:RILL_SOFTIRQ)。注意,不能简单的加到最后,要根据你想要的优先级

来加。想高点,就加到前面一点,反之,你懂的。
3》编译内核
4》在你的驱动里注册软中断处理函数
open_softirq(RILL_SOFTIRQ,rill_softirq_func,NULL);
5》在你的中断处理程序返回前触发软中断(加标记)
raise_softirq(RILL_SOFTIRQ);这个函数会先禁止中断,返回前恢复;
如果你知道中断已经禁止了就用下面这个函数:
raise_softirq_irqoff(RILL_SOFTIRQ);