Linux内核深度解析之中断、异常和系统调用——中断下半部之软中断

系统调用深度解析:从软中断到内核实现,手把手完成操作系统实验 系统调用是操作系统为用户程序提供服务的核心接口,它定义了用户态与内核态之间的标准通信机制。其基本原理是通过软中断(如int 0x80或syscall指令)触发处理器特权级切换,使CPU从用户态(Ring 3)切换到内核态(Ring 0),从而安全地执行内核代码。这一机制的技术价值在于实现了资源访问的隔离与保护,确保了系统的安全性和稳定性。在应用场景上,系统调用支撑了文件操作、进程管理、网络通信等几乎所有上层应用功能。本文以“头歌”平台的操作系统实验为切入点,详细剖析了系统调用的完整实现路径,包括添加系统调用 阅读详情

软中断

软中断(softirq)是中断处理程序在开启中断的情况下执行的部分,可以被硬中断抢占。

内核定义了一张软中断向量表,每种软中断有一个唯一的编号,对应一个softirq_action实例,softirq_action实例的成员action是处理函数。

kernel/softirq.c
static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;		/* 软中断向量表 */

include/linux/interrupt.h
struct softirq_action
{
	void	(*action)(struct softirq_action *);		/* 软中断处理函数 */
};

1. 软中断的种类

目前内核定义了10种软中断,定义如下:

include/linux/interrupt.h
enum
{
	HI_SOFTIRQ=0,		/* 高优先级的小任务 */
	TIMER_SOFTIRQ,		/* 定时器软中断 */
	NET_TX_SOFTIRQ,		/* 网络栈发送报文的软中断 */
	NET_RX_SOFTIRQ,		/* 网络栈接收报文的软中断 */
	BLOCK_SOFTIRQ,		/* 块设备软中断 */
	IRQ_POLL_SOFTIRQ,	/* 支持IO轮询的块设备软中断 */
	TASKLET_SOFTIRQ,	/* 低优先级的小任务 */
	SCHED_SOFTIRQ,		/* 调度软中断,用于在处理器之间的负载均衡 */
	HRTIMER_SOFTIRQ, 	/* 高精度定时器 */
	RCU_SOFTIRQ,    	/* RCU软中断 */

	NR_SOFTIRQS
};

软中断的编号越小优先级越高。

2. 注册软中断的处理函数

函数open_softirq()用来注册软中断的处理函数,在软中断向量表中为指定的软终端编号设置处理函数。

kernel/softirq.c
void open_softirq(int nr, void (*action)(struct softirq_action *))
{
	softirq_vec[nr].action = action;
}

同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区。

3. 触发软中断

函数raise_softirq用来触发软中断,参数是软中断编号。

void raise_softirq(unsigned int nr);

在已经禁止中断的情况下可以调用函数raise_softirq_irqoff来触发中断。

void raise_softirq_irqoff(unsigned int nr);

函数raise_softirq在当前处理器的待处理软中断位图中为指定的软中断编号设置对应的位,如下所示:

raise_softirq()  ->  raise_softirq_irqoff()  ->  __raise_softirq_irqoff()

kernel/softirq.c
void __raise_softirq_irqoff(unsigned int nr)
{
	trace_softirq_raise(nr);
	or_softirq_pending(1UL << nr);
}

把宏or_softirq_pending展开以后是:

irq_stat[smp_processor_id()].__softirq_pending |= (1UL << nr);

4. 执行软中断

内核执行软中断的地方如下:

(1)在中断处理程序的后半部分执行软中断,对执行时间有限制:不能超过2毫秒,并且最多执行10次;

(2)每个处理器有一个软中断线程,调度策略是SCHED_NORMAL,优先级是120;

(3)开启软中断的函数local_bd_enable()。

(1)中断处理程序执行软中断

在中断处理程序的后半部分,调用函数irq_exit()以退出中断上下文,处理软中断,其代码如下:

kernel/softirq.c
void irq_exit(void)
{
    ...
	preempt_count_sub(HARDIRQ_OFFSET);
	if (!in_interrupt() && local_softirq_pending())		/* 如果正在处理的硬中断没有抢占正在执行的软中断,没有禁止 */ 
		invoke_softirq();		/* 软中断并且当前处理器待处理软中断位图不是空的,那么调用函数invoke_softirq来处理软中断 */
								/* 如果in_interrupt()为真,表示在不可屏蔽中断、硬中断或软中断上下文,或者禁止软中断 */
    ...
}

函数invoke_softirq()来处理软中断,其主要代码如下:

kernel/softirq.c
tatic inline void invoke_softirq(void)
{
	if (ksoftirqd_running(local_softirq_pending()))		/* 如果软中断线程处于就绪状态或运行状态,那么让软中断线程执行软中断 */
		return;

	if (!force_irqthreads) {		/* 如果没有强制中断线程化,那么调用函数__do_softirq()执行软中断 */
		__do_softirq();
	} else {		/* 如果强制中断线程化,那么唤醒软中断线程执行软中断 */
		wakeup_softirqd();
	}
}

函数__do_softirq是执行软中断的核心函数,其主要代码如下:

kernel/softirq.c
#define MAX_SOFTIRQ_TIME  msecs_to_jiffies(2)
#define MAX_SOFTIRQ_RESTART 10
asmlinkage __visible void __softirq_entry __do_softirq(void)
{
	unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
	unsigned long old_flags = current->flags;
	int max_restart = MAX_SOFTIRQ_RESTART;
	struct softirq_action *h;
	bool in_hardirq;
	__u32 pending;
	int softirq_bit;

	/*
	 * Mask out PF_MEMALLOC s current task context is borrowed for the
	 * softirq. A softirq handled such as network RX might set PF_MEMALLOC
	 * again if the socket is related to swap
	 */
	current->flags &= ~PF_MEMALLOC;

	pending = local_softirq_pending();		/* 把局部变量pending设置为当前处理器的待处理软中断位图 */
	account_irq_enter_time(current);

	__local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET);		/* 把抢占计数器的软中断计数加1 */
	in_hardirq = lockdep_softirq_start();

restart:
	/* Reset the pending bitmask before enabling irqs */
	set_softirq_pending(0);		/* 把当前处理器的待处理软中断位图重新设置为0 */

	local_irq_enable();		/* 开启硬中断 */

	h = softirq_vec;

	while ((softirq_bit = ffs(pending))) {		/* 从低位向高位扫描待处理软中断位图,针对每个设置了对应位的软中断 */
		unsigned int vec_nr;		/* 编号,执行软中断的处理函数 */
		int prev_count;

		h += softirq_bit - 1;

		vec_nr = h - softirq_vec;
		prev_count = preempt_count();

		kstat_incr_softirqs_this_cpu(vec_nr);

		trace_softirq_entry(vec_nr);
		h->action(h);
		trace_softirq_exit(vec_nr);
		if (unlikely(prev_count != preempt_count())) {
			pr_err("huh, entered softirq %u %s %p with preempt_count %08x, exited with %08x?\n",
			       vec_nr, softirq_to_name[vec_nr], h->action,
			       prev_count, preempt_count());
			preempt_count_set(prev_count);
		}
		h++;
		pending >>= softirq_bit;
	}

	rcu_bh_qs();
	local_irq_disable();		/* 禁止硬中断 */

	pending = local_softirq_pending();
	if (pending) {		/* 如果软中断的处理函数又触发软中断 */
		if (time_before(jiffies, end) && !need_resched() &&
		    --max_restart)		/* 如果软中断的执行时间小于2毫秒,不需要重现调度进程,并且软中断的执行次数没超过10 */
			goto restart;		/* 那么跳转到restart继续执行软中断 */

		wakeup_softirqd();		/* 唤醒软中断线程执行软中断 */
	}

	lockdep_softirq_end(in_hardirq);
	account_irq_exit_time(current);
	__local_bh_enable(SOFTIRQ_OFFSET);		/* 把抢占计数器的软中断计数减1 */
	WARN_ON_ONCE(in_interrupt());
	current_restore_flags(old_flags, PF_MEMALLOC);
}

(2)软中断线程

每个处理器有一个软中断线程,名称是“ksoftirqd/”后面跟着处理器编号,调度策略是SCHED_NORMAL,优先级是120。

软中断线程的核心函数是run_ksoftirqd(),其代码如下:

tatic void run_ksoftirqd(unsigned int cpu)
{
	local_irq_disable();		/* 禁止硬中断 */
	if (local_softirq_pending()) {
		/*
		 * We can safely run softirq on inline stack, as we are not deep
		 * in the task stack here.
		 */
		__do_softirq();
		local_irq_enable();
		cond_resched();
		return;
	}
	local_irq_enable();		/* 开启硬中断 */
}

(3)开启软中断时执行软中断

当进程调用函数local_bd_enable()开启软中断的时候,如果是开启最外层的软中断,并且当前处理器的待处理软中断位图不是空的,那么执行软中断。

local_bh_enable()  ->  __local_bd_enable_ip()

kernel/softirq.c
void __local_bh_enable_ip(unsigned long ip, unsigned int cnt)
{
	...
	preempt_count_sub(cnt - 1);

	if (unlikely(!in_interrupt() && local_softirq_pending())) {
		do_softirq();
	}

	preempt_count_dec();
    ...
}

5. 抢占计数器

每个进程的thread_info结构体中有一个抢占计数器:int interrupt_count,它用来表示当前进程能不能被抢占。

抢占是指当进程在内核模式下运行的时候可以被其他进程抢占,如果优先级更高的进程处于就绪状态,强行剥夺当前进程的处理器使用权。

内核按照各种场景对抢占计数器的位进行了划分:

其中0~7位表示抢占计数;

第8~15位是软中断计数;

第16~19位是硬中断计数;

第20为是不可屏蔽中断计数。

include/linux/preempt.h
/*
 *         PREEMPT_MASK:	0x000000ff
 *         SOFTIRQ_MASK:	0x0000ff00
 *         HARDIRQ_MASK:	0x000f0000
 *             NMI_MASK:	0x00100000
 * PREEMPT_NEED_RESCHED:	0x80000000
 */
#define PREEMPT_BITS	8
#define SOFTIRQ_BITS	8
#define HARDIRQ_BITS	4
#define NMI_BITS	1

各种场景分别利用各自的位禁止或开启抢占:

(1)普通场景(PREEMPT_MASK):对应函数preempt_disable()和preempt_enable();

(2)软中段场景(SOFTIRQ_MASK):对应函数local_bd_disable()和local_bh_enable();

(3)硬中断场景(HARDIRQ_MASK):对应函数__irq_enter()和__irq_exit()

(4)不可屏蔽中断场景(NMI_MASK):对应函数nmi_enter()和nmi_exit()

反过来也可以通过抢占计数器的值判断当前处在什么场景:

include/linux/preempt.h
#define in_irq()		(hardirq_count())
#define in_softirq()		(softirq_count())
#define in_interrupt()		(irq_count())
#define in_serving_softirq()	(softirq_count() & SOFTIRQ_OFFSET)
#define in_nmi()		(preempt_count() & NMI_MASK)
#define in_task()		(!(preempt_count() & \
				   (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET)))

#define hardirq_count()	(preempt_count() & HARDIRQ_MASK)
#define softirq_count()	(preempt_count() & SOFTIRQ_MASK)
#define irq_count()	(preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \
				 | NMI_MASK))

in_irq()表示硬中断场景,也就是正在执行硬中断。

in_softirq()表示软中断场景,包括禁止软中断和正在执行软中断。

in_interrupt()表示正在执行不可屏蔽中断、硬中断或软中断、或者禁止软中断。

in_servicing_softirq()表示正在执行软中断。

in_nmi()表示不可屏蔽中断场景。

in_task()表示普通场景,也就是进程上下文。

6.禁止/开启软中断

禁止软中断的函数是local_bd_disable(),注意:这个函数只能禁止本处理器的软中断,不能禁止其他处理器的软中断。该函数把抢占计数器的软中断计数加2其他代码如下:

include/linux/bottom_half.h
static __always_inline void __local_bh_disable_ip(unsigned long ip, unsigned int cnt)
{
	preempt_count_add(cnt);
	barrier();
}

static inline void local_bh_disable(void)
{
	__local_bh_disable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET);
}

include/linux/preempt.h
#define SOFTIRQ_DISABLE_OFFSET	(2 * SOFTIRQ_OFFSET)

开启软中断的函数是local_bd_enable(),该函数把抢占计数器的软中断计数减2。

为什么禁止软中断的函数local_bd_disable()把抢占计数器的软中断计数加2,而不是加1呢?目的是区分禁止软中断和正在执行软中断这两种情况。__do_softirq()把抢占计数器的软中断计数加1,。如果软中断计数是奇数,可以确定正在执行软中断。

【Bug已解决】claude: command not found 解决方案 方案适用场景推荐指数添加 PATH全局 bin 目录确实存在但未加入 PATH⭐⭐⭐⭐⭐nvm 重新安装多 Node 版本切换导致失效⭐⭐⭐⭐⭐Windows 环境变量检查Windows 平台专用⭐⭐⭐⭐原生安装脚本想彻底避开 npm PATH 问题⭐⭐⭐⭐清理多重 Node 安装系统里有多套 Node 管理方式冲突⭐⭐⭐报错的核心是npm 全局安装的可执行文件路径没有正确出现在系统的 PATH 环境变量里,而不是安装本身失败了。 阅读详情

相关推荐

保姆级教程:手把手教你用Python+Zemax仿真一个简易的Nd:YAG固体激光器谐振腔

本文提供了一份详细的Python与Zemax结合的Nd:YAG固体激光器谐振腔仿真教程。从基础理论到实战操作,涵盖晶体参数化、谐振腔设计、泵浦建模、动态仿真及热效应补偿等关键步骤,适合光学专业学生和工程师快速掌握激光器仿真技术。

weixin_30500473的博客 739

系统调用软中断处理程序SYSTEM_CALL分析

3、system_call分析:D:\学习资料\linux\linux-3.18.6\linux-3.18.6\arch\x86\kernel\entry_32.S。上一篇博客分析了用户空间部分:API——封装例程。system_call主要流程:save_all——系统调用应用程序——restore_all。最近学习了系统调用的整个流程,这里总结并记录。系统调用整个过程为:API——封装例程——system_call——系统调用程序。可以看到,我们将系统调用处理函数断住后,当使用系统调用,就会断住。

tjyuanxi的博客 209

LIS3DHTR三轴加速度计Arduino驱动与嵌入式集成指南

加速度计是嵌入式系统中实现运动感知、姿态解算和振动分析的核心传感器。其工作原理基于MEMS微机械结构在惯性力作用下的电容变化,经片内ADC转换为数字信号;I²C接口因其硬件资源占用少、布线简洁,成为低功耗物联网节点的主流通信方式。技术价值体现在高分辨率(12位)、多量程(±2g~±16g)与低功耗(待机电流仅2µA)的平衡,支撑电池供电设备长期运行。典型应用场景包括可穿戴设备的姿态识别、工业预测性维护中的振动监测,以及智能硬件的敲击/跌落检测。本文围绕LIS3DHTR芯片及其Grove模块,详解Arduin

weixin_42584758的博客 594

中断驱动程序之poll机制

本代码来自于韦东山嵌入式二期驱动视频所讲解,仅供学习参考。如有侵权等行为,可当即撤销本文章。更多信息请关注www.100ask.com!!!#include &lt;linux/module.h&gt; #include &lt;linux/kernel.h&gt; #include &lt;linux/fs.h&gt; #include &lt;linux/init.h&gt; #include...

embed+ 719

C++语言程序设计教程第4版杨进才沈显君课后习题答案解析

为了更好地学习这门课程,我尝试在网上寻找一些学习资料和参考书籍,但效果并不是很理想。因此,我希望能有一些学长学姐或者是有经验的程序员能够分享一些学习经验和方法,让我更好地掌握这门课程。学习过程中,我发现这本书的内容非常丰富,讲解也非常详细,对于像我这样编程基础薄弱的学生来说,是一本非常实用的教材。同时,我也希望有经验的程序员能够推荐一些适合初学者的C++语言学习资料和工具,以便我能更好地学习和掌握这门课程。总之,希望能得到大家的帮助和支持,让我更好地学习和掌握C++语言程序设计。主 编: 杨进才,沈显君。

weixin_58833001的博客 1331

AI中台系统设计方案探讨

集成JupyterLab、低代码建模工具(如H2O.ai)、预训练模型库(Hugging Face、PaddleHub)。:通过REST/gRPC接口封装AI能力(如OCR、语音识别),支持流量控制与鉴权(如Kong、Apigee)。:服务注册发现(Consul)、熔断降级(Hystrix)、监控告警(Prometheus+Grafana)。:分布式存储(如HDFS、Ceph)与对象存储(如S3、OSS),支持海量数据高速读写。加密传输(TLS)、动态脱敏(如数据掩码)、访问控制(RBAC)。

reset2021的博客 1031

linux软中断和系统调用深入研究

arm软中断模式 arm7种模式 有中断模式,但是并没有软中断模式。那么arm的软中断是什么呢? arm的软中断是arm从用户模式切换到特权模式,也就是linux中从用户态切换到内核态的过程。 swi命令触发软中断 linux系统中,swi异常向量代码: linux系统调用 x86 架构是硬中断int 80,中断号为80来实现系统调用的; arm架构是使用swi命令,使arm切换为软中断模式,执行swi异常向量表中的异常向量。 软中断的异常向量 arm中异常象量表: 异常类型 偏移地址(低) 偏移

qq_40036519的博客 2700

区块链技术在碳足迹数据存证与溯源中的应用深度解析

消费者扫描产品上的二维码,即可通过区块链浏览器查询到该产品的数字碳标签,并追溯其从茶园到货架的每一步碳足迹数据,以及这些数据是如何被智能合约自动计算和认证的,从而建立起强大的品牌信任。如果说哈希链解决了数据的“存”与“证”的问题,那么智能合约则解决了数据“用”与“管”的自动化问题。综上所述,虽然针对“碳足迹数据可追溯性”这一特定应用场景的公开、标准化的性能基准案例尚不丰富,但现有研究和企业级解决方案(特别是联盟链)已经证明,通过合理的技术选型和架构设计,区块链的性能可以满足实际商业需求。

百态·数智思维 | 聚焦大数据、量化与未来AI 1105

linux驱动源码分析(xilinx的千兆网口)

1.涉及的文件: macb_main.c phy_device.c dp83867.c phy_device.c 在内核启动就会运行该驱动,它是匹配PHY和配置phy的重要接口。 2.驱动之间的关系 macb_mii_probe ——> phy_connect_direct ---》 phy_attach_direct phy_init -----》 phy_driver_r...

MENGHUANBEIKE的专栏 3126

KiCad自动布线实战:FreeRouting插件安装与使用指南

在PCB设计流程中,布线环节往往占据大量重复性工作,尤其对于中小型双面板,成百上千条飞线的手动连接既繁琐又易出错。自动布线技术通过算法在给定设计规则和元件布局的基础上自动规划走线路径,能显著提升布线效率。FreeRouting作为一款开源自动布线器,与KiCad通过DSN/SES标准中间格式无缝配合,让工程师将精力集中于关键信号和布局优化,而将常规网络交给工具处理。本文从自动布线的原理与边界出发,讲解了FreeRouting的安装、DSN导出、参数设置、自动布线及结果回传的完整流程,并结合实际案例展示了在S

weixin_32025789的博客 277

Eureka自我保护机制

Eureka自我保护机制 默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last

Soul_Ming的博客 542

系统调用与中断

中断(Interrupt)和系统调用(Syscall)是操作系统中两个关键机制,分别用于处理硬件事件和用户程序与内核的交互。它们虽然都涉及从用户模式到内核模式的切换,但设计目的和触发方式不同。处理来自硬件或软件的异步事件,强制CPU暂停当前任务,转而去执行特定的处理程序(如键盘输入、定时器到期、磁盘I/O完成等)。为用户程序提供访问内核功能的接口(如文件操作、进程创建、网络通信),是。从用户模式切换到内核模式的唯一安全途径。

m0_75006599的博客 1263

【Ellisys】【使用技巧】【二】

支持所有常见的编码器和协议实时播放或保存(无线和HCI)循环播放导出与其他视图协同(OverView 和 Spectrum)可以通过下面的位置看 重传的包。

奔跑吧 android 的博客 135

linux 异常时软中断,Linux内核深度解析之中断、异常和系统调用——中断下半部之软中断...

软中断软中断(softirq)是中断处理程序在开启中断的情况下执行的部分,可以被硬中断抢占。内核定义了一张软中断向量表,每种软中断有一个唯一的编号,对应一个softirq_action实例,softirq_action实例的成员action是处理函数。kernel/softirq.cstatic struct softirq_action softirq_vec[NR_SOFTIRQS] __ca...

weixin_33188115的博客 444

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【Linux】Linux 开发必备:信号处理时机 + 中断向量表 + 系统调用表,内核态切换核心知识点

本文深入解析Linux信号处理机制与内核态/用户态的交互原理。信号处理的"合适时机"是进程从内核态返回用户态的瞬间,此时OS会检查未决信号并执行处理。详细剖析了四种信号处理动作的差异,重点说明自定义信号处理函数涉及的用户态/内核态多次切换流程。同时,从硬件视角揭示中断机制与信号设计的相似性,包括中断控制器工作原理和中断向量表的映射逻辑,并强调时钟中断作为OS调度核心驱动力对进程管理的关键作用。通过硬件中断与软件信号的对比,展现了操作系统异步事件处理的统一设计思想。

欢迎来到我的博客,私信我可以一起交流技术 1678

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Note】《Linux 内核深度解析:基于 ARM64 架构的 Linux 4.x 内核》第四章:中断、异常与系统调用

模块关键点异常级别(EL)用户 EL0,内核 EL1,支持从 EL0 向上触发异常异常向量表VBAR_EL1 指向的向量,入口在entry.S中中断控制器GICv3 架构,支持 IRQ 分发,支持 CPU 热插拔中断处理流程汇编入口 → IRQ 分发器 → 驱动注册的回调系统调用路径EL0 发起SVC,EL1 解析 syscall number 调用 syscall 表pt_regs 上下文结构用于保存/恢复寄存器、状态寄存器、异常返回。

YZJincsdn的博客 1178

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Linux内核深度解析之中断、异常和系统调用——中断下半部之小任务

小任务 小任务(tasklet,有的书中翻译为“任务蕾”)是基于软中断实现的。为什么要提供小任务?因为小任务相对软中断有以下优势: (1)软中断的种类是编译时静态定义的,在运行时不能添加或删除;小任务可以在运行时添加或删除 (2)同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区;一个小任务同一时刻只能在一个处理器上执行,不要求处理函数是可以重入的。 小任务根据优先级分为两种:低优先级小任务和高优先级小任务。 1. 数据结构 小任务的数据结构如下:

linuxweiyh的博客 396

Linux内核中断处理机制深度解析

中断处理核心技术解析 本文系统梳理了Linux中断处理机制的关键技术点,主要内容包括: 中断分类体系:详细对比硬件中断、软件中断、异常和NMI四种类型,说明其触发源和使用场景差异,并给出标准中断和线程化中断的注册代码示例。 处理全流程:通过流程图展示从触发到下半部执行的完整路径,重点解析中断源识别、标志清除(含不同硬件清除方式)、临界区保护和下半部机制选择等核心步骤。 故障解决方案:针对中断丢失、中断风暴、共享冲突和上下文错误等典型问题,提供具体代码级解决方案,包括中断标志处理、限流机制和共享中断验证等。

Youngist的博客 1180

30秒看懂中断处理:硬中断与软中断如何协作避免系统崩溃?

在计算机系统中,中断是一种至关重要的异步事件处理机制,它能让操作系统及时响应硬件设备的请求,提升系统的并发处理能力。而硬中断与软中断的协作则是保障系统稳定运行的核心机制,它们分工明确,共同确保系统在处理各种设备请求时既高效又安全。 ## 一、中断是什么? 中断就像生活中的“电话通知”,当外卖送达时(硬件请求),配送员会打电话(触发中断),你会停下手中的工作去取外卖(处理中断)。在计算机中,中断

gitblog_00165的博客 723

【Linux】进程信号深度解析:从中断本质到信号捕捉全流程

本文系统性地探讨了Linux系统中的信号机制及其与中断的深层关联。信号作为进程间通信的"软中断",其生命周期包含产生、保存和递达三个阶段,处理方式分为默认、忽略和自定义三种。文章从生活场景类比入手,详细解析了信号的五大触发来源(终端按键、系统命令、软件条件、硬件异常等),并深入剖析了内核中信号保存的未决与阻塞机制。通过对比硬件中断、时钟中断、软中断和异常的实现原理,揭示了信号作为用户态中断的本质特性。最后,文章还提供了信号捕捉的完整流程分析、常见陷阱规避指南以及实际应用场景。

CodeByV的博客 1393

Istio与系统软中断:深度解析与问题排查全指南

Istio与系统软中断:深度解析与问题排查全指南

虽非技冠群英首,愿与同道共长歌; 大鹏一日同风起,扶摇直上九万里; 951

Linux 内核活动专题

​在CPU得知发生中断后,它将进一步的处理委托给一个软件例程,该例程可能会修复故障、提供专门的处理或将外部事件通知用户进程。由于每个中断和异常都有唯一的编号,内核使用一个数组,数组项是指向处理程序函数的指针。相关的中断号根据数组项在数组中的位置判断,如图14-1所示。...

qq_53111905的博客 963

Linux内核深度解析之中断、异常和系统调用——中断下半部

中断下半部 Linux中断下半部有3种:软中断(softirq)、小任务(tasklet)和工作队列(workqueue)。3种下半部的区别: (1)软中断和小任务不允许睡眠;工作队列是使用内核线程实现的,处理函数可以睡眠 (2)软中断的种类是编译时静态定义的,在运行时不能添加或删除;小任务可以在运行时添加或删除 (3)同一种软中断的处理函数可以在多个处理器上同时执行,处理函数必须是可以重入的,需要使用锁保护临界区;一个小任务同一时刻只能在一个处理器上执行,不要求处理函数是可以重入的 ...

linuxweiyh的博客 296

Linux中断机制:深度解析与应用

Linux 中断机制在操作系统中占据着至关重要的地位。它就像是一座关键的桥梁,连接着硬件与内核,使得处理器和外部设备能够协同工作,极大地提高了系统的响应性和效率。在 Linux 系统中,中断分为外部中断和内部中断。外部中断是由硬件设备发出的,比如定时器中断、网络数据包到达等。当硬件设备出现需要处理的情况时,会触发相应的中断信号,将控制权交给操作系统内核,执行中断处理程序。内部中断则是由软件程序主动触发的,如调用系统调用、发生异常等。

深度Linux 1131

Linux 网络驱动 NAPI 机制深度解析:从硬件中断到软中断的收包路径全链路分析

NAPI 机制通过"中断唤醒 + 软中断轮询"的双模策略,在吞吐量和 CPU 利用率之间取得了工程平衡。深入理解状态切换、的预算和时间控制、驱动层poll的缓冲区管理三者之间的协作,是优化嵌入式 Linux 网络性能的必备知识。在实际调优中,应重点关注中断亲和性配置与参数的匹配关系,并结合perf top观察和igb_poll的 CPU 占用比例,以此决定是否需要开启 busy polling 或调整 RSS 队列数。

qq_42431428的博客 5118

Linux中断处理

Linux中断处理1、  Introduce 异常为同步事件,有当前进程执行引发,处于被打断的进程的上下文中,为当前被打断的进程服务,可以调用任何内核态的函数,也可以睡眠。中断时异步事件,虽然使用当前被打断的进程的上下文中,但和当前进程没有必然的关系,同时要求能快速处理以便能及时响应下一次中断,因此在中断处理过程中是不可睡眠的。IA32体系允许256个中断、异常源,0~31用于不可屏蔽中断

w_health的专栏 1320
上一篇: Linux内核深度解析之中断、异常和系统调用——中断下半部
下一篇: Linux内核深度解析之中断、异常和系统调用——中断下半部之小任务
linuxweiyh
博客等级 码龄11年 171粉丝 152原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值