在Linux2.2中,对中断的后半部分处理只提供了bh机制,而在2.4中新增加了两种机制:软中断和tasklet。通过上面的介绍我们知道,同一个软中断服务例程可以同时在不同的CPU上运行。为了提高SMP的性能,软中断现在主要用在网络子系统中。多个tasklet可以在多个不同的CPU上运行,但一个CPU一次只能处理一个tasklet。Bh由内核进行了串行化处理,也就是在SPM环境中,某一时刻,一个bh函数只能由一个CPU来执行。如果要把Linux2.2中的bh移植到2.4的tasklet,请按下面方法进行:
1.Linux2.4中对bh的处理
假设一个bh为FOO_BH(FOO表示任意一个),其处理函数为foo_bh,则
(1)处理函数的原型为: void
foo_bh(void);
(2)通过init_bh(FOO_BH, foo_bh)函数对foo_bh进行初始化
(3)通过mark_bh(FOO_BH)函数提出对foo_bh()的执行请求。
2.把bh移植到tasklet
(1)处理函数的原型为:void
foo_bh(unsigned long data);
(2)通过宏
DECLARE_TASKLET_DISABLED(foo_tasklet, foo_bh, 0) 或
struct tasklet_struct foo_tasklet;
tasklet_init(&foo_tasklet, foo_bh, 0);
tasklet_disable(&foo_tasklet);
对foo_tasklet进行初始化
(3)通过
tasklet_enable(&foo_tasklet);
tasklet_schedule(&foo_tasklet)
对foo_tasklet进行调度。