软中断实现:
1) 软中断是在编译期间静态分配的
2) 软中断有softirq_action结构表示,它在
中定义。
3) static struct softirq_action sotfirq_vec[32]定义了软中断
数组,每一个被注册的软中断都占据了该数据的一项、
4) 一个软中断不会抢占另一个软中断,唯一可以抢占软中断的
是中断处理程序。但其他软中断(包括相同类型的软中断)
可以在其他处理器上同时运行。
5) 一个注册的软中断必须在被标记之后才会执行,称为触发
软中断(raising the softirq)。
软中断的执行时机:
1) 处理完一个硬件中断以后,在irq_exit()调用。
kernel/irq/handle.c
2) 在ksoftirqd内核线程中。kernel/softirq.c
3) 在显示检查和执行待处理的软中断的代码中,
如网络子系统。
4) 无论哪种方式唤起软中断处理,软中断都要
在do_softirq()中执行。kernel/softirq.c
软中断使用:
1)软中断是保留个系统中对时间要求最严格以及最重要的
下半部分使用的。
2) 目前只有网络子系统和SCSI子系统直接使用软中断
3) 内核定时器和tasklet都是建立在软中断上的
4) 只有当对时间要求严格并能高效的完成加锁工作时,才推
荐使用软中断
添加新的软中断:
1.分配索引
1) 通过在中定义的枚举类型来静态
地声明软中断。
2) 索引表示一种相对优先级,索引号小的软中断先执行。
3) 建立新的软中断必须在此枚举类型中加入新的项,根据
所期望的优先级来决定加入的位置。
4) 使用习惯:HI_SOFTIRQ作为第一项;
TASKLET_SOFTIRQ作为最后一项;
2.注册软中断处理程序
1) 调用open_softirq()注册软中断处理函数
软中断索引号
软中断处理函数
Data域存放的值
2) 软中断处理程序的特点:
允许响应中断,但其本身不能休眠
其执行时,当前处理器的软中断被禁止,但其他处理器仍
可执行,所以需要考虑多处理去的情况下的同步。
其内部使用的全局变量也需要严格的锁保护
不可通过互斥的加锁方法来防止其自身的并发
3.触发软中断
1) 通过raise_softirq()将软中断设置为挂起状态
rasie_softirq()参数为软中断号
在触发软中断前禁止中断,触发后在恢复原来的状态
2)raise_softirq_irqoff()
当中断本身就已经被禁止时,用此函数将中断置为挂起状态。
3) 内核执行完中断处理程序以后,马上会调用do_softirq(),让
软中断去完成 中断处理程序未完成的工作。