日期:2014-05-16 浏览次数:20705 次
1
2
3
4
|
struct softirq_action{ void (*action)( struct softirq_action *); //待执行的函数 void *data; //传给函数的参数 }; |
kernel/softirq.c中定义了一个包含有32个结构体的数组:
1
|
static struct softirq_action softirq_vec[32] |
每个被注册的软中断都占据该数组的一项,因此最多可能有32个软中断,这是没法动态改变的。由于大部分驱动程序都使用tasklet来实现它们的下半部,所以现在的内核中,只用到了6个。上面的软中断结构中,第一项是软中断处理程序,原型如下:
1
|
void
softirq_handler( struct
softirq_action *) |
当内核运行一个软中断处理程序时,它会执行这个action函数,其唯一的参数为指向相应softirq_action结构体的指针。例如,如果my_softirq指向softirq_vec数组的实现,那么内核会用如下的方式调用软中断处理程序中的函数:
1
|
my_softirq->action(my_softirq) |
一个软中断不会抢占另外一个软中断,实际上,唯一可以抢占软中断的是中断处理程序。不过,其他的软中断----甚至是相同类型的软中断-----可以在其他类型的机器上同时执行。一个注册的软中断必须在被标记后才能执行----触发软中断(rasing the softirq).通常,中断处理程序会在返回前标记它的软中断,使其在稍后执行。在下列地方,待处理的软中断会被检查和执行:
1
免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
|