Linux 下半部机制介绍(二)——softirq(软中断)框架介绍

本文深入剖析Linux软中断机制,从数据结构出发,详细解释软中断的关键组件,包括__softirq_pending变量、softirq_vec函数指针数组及preempt_count的作用。同时,介绍了软中断的注册、触发和处理流程,以及核心函数__do_softirq的工作原理。

在分析softirq框架时,我们按照数据结构+算法拆开来分析(转载请标明出处)

一、抛开代码细节,聊聊软中断关键的数据结构

在上一章介绍中,我们看到了程序员是如何通过上下部机制来压榨CPU的剩余价值。

里面提到了上下部分机制的理解——上半部记录,下半部处理,软中断设计思路就按照这个中心思想来

我们抛开代码细节逻辑,先看看软中断需要哪些信息才能正常工作

1.之前提到了上下半部工作机制,上半部主要工作就是记录

那么我们首先需要一个数据结构来保存这个信息,上半部记录到我们需要处理什么,下半部拿到记录信息,逐个处理待处理的任务,这个记录的数据结构就是嵌入到irq_stat中的__softirq_pending变量,__softirq_pending每一位表示一类软中断,irq_stat是一个每CPU变量。相关代码如下

DEFINE_PER_CPU_ALIGNED(irq_cpustat_t, irq_stat)
typedef struct {
	unsigned int __softirq_pending;
	unsigned int ipi_irqsp[NR_IPI];
} ____cacheline_aligned irq_cpustat_t;

2.在__softirq_pending中纪录下来需要处理那些软中断后,具体要做哪些工作,也需要一个数据结构来保存,softirq使用了一个函数指针数组softirq_vec来保存具体要做哪些事情

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

enum
{
	HI_SOFTIRQ=0,
	TIMER_SOFTIRQ,
	NET_TX_SOFTIRQ,
	NET_RX_SOFTIRQ,
	BLOCK_SOFTIRQ,
	IRQ_POLL_SOFTIRQ,
	TASKLET_SOFTIRQ,
	SCHED_SOFTIRQ,
	HRTIMER_SOFTIRQ,
	RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */

	NR_SOFTIRQS
};
static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;

 3.在处理软中断与硬件中断类似,在软中断处理过程中,虽然可以响应硬件中断,但是不应该被抢占的,而且有时候

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值