Linux的上半部分就是中断处理函数,下半部分采用三种机制来实现
**上半部:**上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。
**下半部:**如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。
因此, Linux 内核将中断分为上半部和下半部的主要目的就是实现中断处理函数的快进快出,那些对时间敏感、执行速度快的操作可以放到中断处理函数中,也就是上半部。剩下的所有工作都可以放到下半部去执行,比如在上半部将数据拷贝到内存中,关于数据的具体处理就可以放到下半部去执行。
中断下半部分的处理
1、任务对时间十分敏感,将其放上半部分
2、如过要处理的任务与硬件有关,可以考虑放上半部分
3、如果处理的内容不希望被其他中断打断,那么可以放上半部分
Linux 内核使用结构体 softirq_action 表示软中断
struct softirq_action
{
void (*action)(struct softirq_action *);
};
总共有10个软中断,定义如下:
static struct softirq_action softirq_vec[NR_SOFTIRQS];
enum
{
HI_SOFTIRQ=0, /* 高优先级软中断 */
TIMER_SOFTIRQ, /* 定时器软中断 */
NET_TX_SOFTIRQ, /* 网络数据发送软中断 */
NET_RX_SOFTIRQ, /* 网络数据接收软中断 */
BLOCK_SOFTIRQ,
BLOCK_IOPOLL_SOFTIRQ,
TASKLET_SOFTIRQ, /* tasklet 软中断 */
SCHED_SOFTIRQ, /* 调度软中断 */
HRTIMER_SOFTIRQ, /* 高精度定时器软中断 */
RCU_SOFTIRQ, /* RCU 软中断 */
NR_SOFTIRQS
}
操作流程如下所示:
/*要使用软中断,必须先使用 open_softirq 函数注册对应的软中断处理函数*/
void open_softirq(int nr , void(*action)(struct softirq_action*));