tasklet和软中断

1.原理

在2.3这个开发版本中,内核开发者引入了软中断和tasklet。软中断是一组静态定义的下半部接口,有32个,可以在所有处理器上同时运行,即使是两个相同类型。tasklet是一种基于软中断实现的,两个不同的tasklet可以在不同的处理器上同时执行,但是相同类型的tasklet不能同时执行。此外,软中断还必须在编译期间就进行静态注册,而tasklet可以通过代码进行动态注册。

2.实现

软中断的实现

软中断是在编译期间静态分配的,软中断由softirq_action结构表示

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

kernel/softirq.c中定义了一个包含有32个该结构体的数组

static struct softirq_action softirq_vec[NR_SOFTIRQS];

每个被注册的软中断都占用该数组中的一项,最多有32个软中断,这是个定值,目前只有部分使用。


1.软中断处理程序

软中断处理程序action的函数原型如下:

void softirq_handler(struct softirq_action *)

当内核运行一个软中断处理程序的时候,它就会执行这个action函数,参数是相应的softirq_action结构体的指针。例如my_softirq指向softirq_vec数组的某项,那么内核会用如下的方式调用软中断处理程序中的函数:

my_softirq->action(my_softirq);

这里有个小技巧,在传参数的时候把整个结构体都传进去了,这样的好处在于当在该结构体中加入新的域时,原有的调用扔然可用,仅仅只需要修改函数的内部实现,从而保证接口不变。


2.软中断的执行

一个软中断必须在被标记后才会执行(设置相应的掩码),这被称为触发软中断,中断处理程序中会标记相应的软中断,在合适的时候,软中断会执行,在下列地方软中断会被检查和执行:

从硬件中断中断代码处返回时。(也可称之为中断处理程序返回时)

在ksoftirqd内核线程中

在那些显示检查和执行待处理的软中断的代码中,如网络子系统。


3.软中断的使用










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值