软中断
软中断使得内核可以延期执行任务。因为它们的运作方式与上文描述的中断类似,但完全是用软件实现的,所以称为软中断(software interrupt)或soft irq是完全符合逻辑的。内核借助于软中断来获知异常情况的发生,而该情况将在稍后由专门的处理程序例程解决。如上所述,内核在do_irq末尾处理所有待决软中断,因而可以确保软中断能够定期得到处理。软中断机制的核心部分是一个表,包含32个softirq_action类型的数据项。软中断必须先注册,然后内核才能执行软中断。
软中断有守护进程,软中断守护进程的任务是,与其余内核代码异步执行软中断。为此,系统中的每个处理器都分配了自身的守护进程,名为ksoftirqd。
软中断类型
上半部称为硬中断(hardirq), 下半部有三种:软中断softirq,小任务tasklet和工作队列workqueue。
三种下半部的区别:
软中断和小任务不允许睡眠,工作队列是使用内核线程实现的,处理函数可以睡眠
软中断的种类是编译时静态定义的,在运行时不能添加或删除;小任务可以在运行时添加或者删除。
同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区。
一个小任务同一时刻只能在一个处理器上执行,不要求处理函数是可以重入的。
软中断softirq是中断处理程序在开启中断的情况下执行的部分,可以被硬中断抢占。内核定义了一张软中断向量表,每种软中断有一个唯一编号,对应一个softirq_action实例。
内核中定义的软中断类型有如下11种:
软中断注册及软中断触发
函数open_softirq()用来注册看软中断的处理函数,在软中断向量表中为制定的软中断编号设置处理函数,
函数raise_softirq()用来触发软中断,参数是软中断编号
执行软中断
1.中断处理程序执行软中断(内核执行软中断的地方)
a.在中断处理程序的后半部分执行软中断,对执行时间有限制:不能超过2毫秒并且最多执行10次;
b.每个处理器有一个软中断线程,调度策略是SCHED_NORMAL,优先级是120.
c.开启软中断的函数
中断处理程序执行软中断