软中断
软中断在编译期间静态分配,不像tasklet能被动态地注册或注销。软中断由结构体softirq_action表示
struct softirq_action{
void (*action) (struct softirq_action *);
}
kernel/softirq.c中定义一个包含有32个该结构体的数组
static struct softirq_action softirq_vec[NR_SOFTIRQS];
1.软中断处理程序
软中断处理程序action的函数原型如下
void softirq_handler(struct softirq_action *)
2.执行软中断
一个注册的软中断必须在被标记后都会执行,这被称作触发软中断。通常中断处理程序会在返回前标记它的软中断,使其稍后被执行。
3.使用软中断
软中断保留给系统中对时间要求最严格以及最重要的下半部使用。
(1)分配索引
编译期间,在<linux/interrupt.h>中定义的一个枚举类型来静态地声明软中断。内核用从0开始的索引来表示一种相对优先级,索引号小的软中断在索引号大的软中断之前执行
(2)注册处理程序
调用open_softirq()注册软中断处理程序,两个参数:软中断的索引号和处理程序。如网络子系统。
open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_TX_SOFTIRQ, net_rx_action);
(3)触发软中断
raise_softirq()函数可以将一个软中断设置为扶起状态,让它在下次调用do_softirq()函数时投入运行。
raise_softirq(NET_TX_SOFTIRQ);
会触发NET_TX_SOFTIRQ软中断。它的处理程序net_tx_action()就会在内核下一次执行软中断时投入使用。该函数在触发一个软中断之前先要禁止中断,触发后再恢复状态