日期:2014-05-16 浏览次数:20934 次
| 
 1 
2 
3 
4 
 | 
structsoftirq_action{    void(*action)(structsoftirq_action *); //待执行的函数    void*data;//传给函数的参数}; | 
kernel/softirq.c中定义了一个包含有32个结构体的数组:
| 
 1 
 | 
staticstructsoftirq_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
                        
                    
                    
                     
                        免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
                     
                    
                
                
            
            
            
    
        
   
 |