0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

软中断回调执行时,本地中断能否响应?内核机制深度解析

jf_44130326 来源:Linux1024 作者:Linux1024 2025-12-05 07:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、核心结论先明确

软中断的回调函数执行过程中,允许响应本地中断,但存在关键限制——默认情况下,软中断本身不会屏蔽本地中断(IRQF_DISABLED标志除外),但会通过内核调度机制控制中断响应的时机和优先级,避免出现嵌套混乱。

要理解这个结论,需先理清三个核心概念的关系:软中断(SoftIRQ)、回调函数(ksoftirqd)、本地中断(Local Interrupt)。

二、底层机制:中断与软中断的优先级逻辑

Linux内核中,中断和软中断的调度遵循“硬件中断>软中断>进程”的优先级体系,这是理解响应规则的基础:

wKgZO2kyE56ALc_uAAAoV8X2Kxo057.jpg

1.硬件中断的本质:由外设触发(如网卡接收数据、磁盘IO完成),会打断当前执行流程(包括软中断回调),执行对应的中断服务程序(ISR)。ISR执行时会屏蔽同类型中断,但默认不屏蔽其他类型中断,且执行时间极短(避免阻塞系统)。

2.软中断的设计初衷:处理硬件中断的“后续工作”(如网卡数据的协议栈解析),由内核主动触发(如ISR中调用raise_softirq ()),运行在中断上下文(与进程上下文隔离,无用户态权限)。

3.回调函数的执行载体:软中断回调由内核线程ksoftirqd执行(每个CPU核心对应一个ksoftirqd/CPU_ID线程),该线程优先级高于普通用户进程,但低于硬件中断。

三、关键分析:回调执行时为何允许本地中断?

1.内核的“中断使能”默认配置

软中断回调执行时,内核不会主动关闭本地CPU的中断总开关(即CPU的IF标志位保持开启)。这意味着:

wKgZO2kyE56AcN2XAAMD83OpPkA690.png

•当软中断回调正在执行时,若有硬件中断触发(如键盘输入、网络包到达),CPU会暂停软中断回调,转而去执行对应的ISR;

•ISR执行完毕后,CPU会回到软中断回调的断点继续执行。

wKgZO2kyE56AaXxIAAEuR8VR6xg827.png

2.例外场景:中断被主动屏蔽

并非所有软中断回调都允许响应本地中断,以下两种情况会屏蔽中断:

wKgZO2kyE56AIeOPAAOV2qxwh24342.png

回调函数显式设置屏蔽:若软中断回调中调用了local_irq_disable ()(关闭本地中断),则在该函数执行期间,本地CPU不会响应任何硬件中断,直到调用local_irq_enable ()恢复;

内核处于原子上下文:软中断本身运行在原子上下文(无调度抢占),若回调函数中持有spinlock(自旋锁,默认会屏蔽本地中断),则持有锁期间,本地中断被屏蔽,避免死锁。

3.实际案例:Linux网卡软中断的执行流程

以网卡接收数据为例,直观理解中断与软中断的交互:

wKgZO2kyE5-AEGohAAS5JJbZY4I759.png

这个过程中,软中断回调的执行被硬件中断打断,证明了“允许响应本地中断”的核心结论。

四、为什么要这样设计?——系统吞吐量与响应性的平衡

内核这样设计的核心目标是平衡“中断响应速度”和“软中断处理效率”:

wKgZO2kyE5-AOS-JAAK3roJrM2Q040.png

1.若软中断回调执行时屏蔽所有本地中断,会导致硬件中断堆积(如网卡数据丢失、磁盘IO延迟),降低系统响应性;

2.若完全不限制中断嵌套,可能导致软中断回调被频繁打断,处理效率低下(如网络软中断一直无法完成协议解析)。

因此,内核采用“默认允许响应,必要时屏蔽”的策略:

•大多数软中断回调(如网络、块设备)允许被硬件中断打断,保证外设数据不丢失;

•关键路径(如持有自旋锁、操作临界资源)通过显式屏蔽中断,保证数据一致性。

五、开发注意事项:软中断回调的编程规范

基于以上机制,编写软中断回调函数时需注意:

wKgZO2kyE5-AMMaMAAGn98gCpUQ453.png

1.避免长时间占用CPU:回调函数运行在原子上下文,无调度抢占,若执行时间过长(如循环处理大量数据),会导致后续软中断堆积,同时可能阻塞硬件中断的响应(虽允许打断,但回调本身耗时会影响整体吞吐量);

2.谨慎使用中断屏蔽:非必要不调用local_irq_disable (),若需屏蔽中断,需尽量缩短屏蔽时间;

3.避免睡眠操作:软中断回调运行在原子上下文,禁止调用schedule ()、msleep ()等会导致睡眠的函数,否则会引发内核崩溃。

六、总结

软中断的回调函数执行过程中,默认允许响应本地硬件中断,这是内核为平衡系统响应性和处理效率的设计选择。中断会打断软中断回调,执行ISR后恢复回调执行;仅在回调显式屏蔽中断或持有自旋锁时,本地中断才会被暂时屏蔽。

理解这一机制,不仅能帮助开发编写更规范的内核代码(如软中断回调),也能在排查系统问题时(如中断延迟、软中断堆积)快速定位根因。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 回调函数
    +关注

    关注

    0

    文章

    94

    浏览量

    12114
  • 软中断
    +关注

    关注

    0

    文章

    9

    浏览量

    3216
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux 2.4.x内核中断机制

    本文从Linux内核几种中断机制相互关系和发展沿革入手,分析了这些机制的实现方法,给出了它们的基本用法。
    发表于 11-02 11:01 0次下载

    基于Linux 中断机制以及tasklet、工作队列机制分析

    中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下
    的头像 发表于 01-15 12:55 4385次阅读
    基于Linux <b class='flag-5'>软</b><b class='flag-5'>中断</b><b class='flag-5'>机制</b>以及tasklet、工作队列<b class='flag-5'>机制</b>分析

    Linux驱动技术之一内核中断

    提出了中断的概念,也有人叫内核中断,其本质就是使用统一的方式对不同硬件中断体系中的中断号进行再
    发表于 05-08 13:49 898次阅读

    Linux中断(interrupt)子系统之一:软件中断(softIRQ)

    软件中断(softIRQ)是内核提供的一种延迟执行机制,它完全由软件触发,虽然说是延迟机制,实际上,在大多数情况下,它与普通进程相比,能得到
    发表于 05-13 10:33 1542次阅读

    5个使用带有中断的技巧

    是对更高级别软件传递到函数的可执行代码的引用。这些能够极大地提高嵌入式软件的可移植性和重用性,但是根据它们的定义,它们需要使用函数指
    的头像 发表于 08-09 09:18 5877次阅读
    5个使用带有<b class='flag-5'>中断</b>的<b class='flag-5'>回</b><b class='flag-5'>调</b>的技巧

    STM32Cube HAL库中断处理机制 以及函数实现原理

    STM32Cube HAL库中断处理机制,以及函数实现原理
    的头像 发表于 03-03 14:01 1.5w次阅读

    HAL库中断处理以及相关的函数

    驱动的开发时间,把重心放在应用代码上。   但是,STM32CubeMX只是生成了底层驱动的初始化代码。所以,我们还需要掌握:应用层代码如何调用HAL库函数(API接口),以及HAL库中断处理机制等相关知识。  HAL库牵涉的内容较多,下面简单描述一下HAL库
    的头像 发表于 01-07 11:46 1w次阅读
    HAL库<b class='flag-5'>中断</b>处理以及相关的<b class='flag-5'>回</b><b class='flag-5'>调</b>函数

    STM32的中断机制 stm32中断方式有几种

    中断机制在单片机中是很重要的环节,中断代码默认地从上往下执行,遇到特定条件或特定语句,将按照指定的程序跳转。而STM32单片机的中断是有两层
    的头像 发表于 07-22 16:38 2.1w次阅读

    STM32编程时,如何确定中断函数的入口

    STM32编程时,如何确定中断函数的函数名换句话说,就是如何找到中断函数的函数名程序进
    发表于 11-23 18:06 13次下载
    STM32编程时,如何确定<b class='flag-5'>中断</b><b class='flag-5'>回</b><b class='flag-5'>调</b>函数的入口

    微机原理——8086中断类型以及中断向量表、中断响应中断返回

    这里写目录标题先验知识回顾控制寄存器回顾1、8086中断类型1、外部可屏蔽中断2、外部不可屏蔽中断3、除法错中断4、单步中断5、断点
    发表于 11-24 16:51 16次下载
    微机原理——8086<b class='flag-5'>中断</b>类型以及<b class='flag-5'>中断</b>向量表、<b class='flag-5'>中断</b><b class='flag-5'>响应</b>、<b class='flag-5'>中断</b>返回

    【LiteOS】08-开发内核-中断机制

    。此时,CPU暂时中止当前程序的执行转而处理这个事务,这个过程就叫做中断。通过中断机制,在外设不需要CPU介入时,CPU可以执行其它任务,而
    发表于 12-01 14:06 9次下载
    【LiteOS】08-开发<b class='flag-5'>内核</b>-<b class='flag-5'>中断</b><b class='flag-5'>机制</b>

    关于Linux的GPIO中断知识

    在嵌入式系统中,经常会用到gpio外部中断来获取外部事件,比如按键、传感器、网络通信等等。一般中断都会绑定一个中断函数,来
    的头像 发表于 03-24 11:27 4430次阅读
    关于Linux的GPIO<b class='flag-5'>中断</b>知识

    RISC-V SiFive U54内核中断介绍

    类型的 RISC-V 中断本地和全局。 本地中断:U54内核本地中断只有2种,软件中断和定时
    的头像 发表于 10-08 09:39 1337次阅读
    RISC-V SiFive U54<b class='flag-5'>内核</b>的<b class='flag-5'>中断</b>介绍

    什么是中断响应次序?什么是中断处理次序?

    次序 所谓中断响应次序,可以理解为当系统出现中断请求时,响应这些请求的顺序。而中断请求是指来自计算机外部或内部的事件(如键盘输入、硬件故障等
    的头像 发表于 10-24 11:49 3723次阅读

    单重中断与多重中断介绍

    程序的过程中,CPU可以去响应更高的中断请求。这被称为中断嵌套。比如,当一个中断服务程序正在执行时,发生了另一个更高优先级的
    的头像 发表于 10-30 16:46 5208次阅读
    单重<b class='flag-5'>中断</b>与多重<b class='flag-5'>中断</b>介绍