中断与软中断

linux内核学习10:中断和异常 一、中断 1.1 中断的概念 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的 CPU 暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常)。 软件对硬件进行配置后,软件期望等待硬件的某种状态(比如,收到了数据),这里有两种方式, 轮询(polling): CPU 不断的去读硬件状态。 中断:当硬件完成某种事件后,给 CPU 一个中断,让 CPU 阅读详情

在分析linux内核的中断,软中断时,先应该明确这样一个派生关系:

irq ==> softirq ==> tasklet ==> bottom half ==> task queue
----------------------------------------------|==> timer

中断是最初的原动力。分时系统依赖于时钟中断来定时重新调度可以运行的程序。外设通过中断来通知cpu处理相关的任务。中断处理程序是内核中一段特殊的,独立的,可运行实体。这个实体,某种程度上,是和进程或线程类似的。

由于中断需要快速处理,因此派生出来软中断softirq来处理中断没有处理完的事情。比如在网卡的驱动程序里,在中断环境里,只是把包放到一个队列里,然后由软中断来把包传递给进程,或者转发包等。

linux的softirq是不可重入的,因此,在单cpu的系统上,一次只能有一个软中断在运行。而在多cpu系统上,可以同时有多个softirq在运行。softirq可以处理更多的任务,一般如协议栈,文件系统等,都可以放到软中断里面处理。

tasklet是在softirq上的一个扩展。它是一段可以执行的代码片断,但是,一个tasklet同时只能在一个cpu上执行(一个tasklet只能有一个活动实体,而一个softirq可以有多个活动实体,但是softirq的活动实体是不可重入的)。

bottom half是linux 2.2.x以前的系统所采用的软中断机制,由于在smp上扩展性不好,现在已经不用了。bh也是一个可执行的代码片断,但是全局只能有一个bh在运行,多个bh之前是线性执行的,所以在smp系统上,浪费比较严重。

task queue是在bh机制上的一个扩展。也是一个可执行的代码片断。其目的是突破bh的数目限制(只有32个)。但是它的执行也是线性的,因此在smp上,也没什么优势。

timer也是bh上的一个扩展。每个timer都是一个可执行的片断,但是它更灵活,所以,如果有优先级高的任务,可以考虑使用timer。

在编写设备驱动时, tasklet 机制是一种比较常见的机制,通常用于减少中断处理的时间,将本应该是在中断服务程序中完成的任务转化成软中断完成。
为了最大程度的避免中断处理时间过长而导致中断丢失,有时候我们需要把一些在中断处理中不是非常紧急的任务放在后面执行,而让中断处理程序尽快返回。在老版本的 linux 中通常将中断处理分为 top half handler 、 bottom half handler 。利用 top half handler 处理中断必须处理的任务,而 bottom half handler 处理不是太紧急的任务。
但是 linux2.6 以后的 linux 采取了另外一种机制,就是软中断来代替 bottom half handler 的处理。而 tasklet 机制正是利用软中断来完成对驱动 bottom half 的处理。 Linux2.6 中软中断通常只有固定的几种: HI_SOFTIRQ( 高优先级的 tasklet ,一种特殊的 tasklet) 、 TIMER_SOFTIRQ (定时器)、 NET_TX_SOFTIRQ (网口发送)、 NET_RX_SOFTIRQ (网口接收) 、 BLOCK_SOFTIRQ (块设备)、 TASKLET_SOFTIRQ (普通 tasklet )。当然也可以通过直接修改内核自己加入自己的软中断,但是一般来说这是不合理的,软中断的优先级比较高,如果不是在内核处理频繁的任务不建议使用。通常驱动用户使用 tasklet 足够了。
软中断和 tasklet 的关系如下图:
 


   tasklet.JPG
   上图可以看出, ksoftirqd 是一个后台运行的内核线程,它会周期的遍历软中断的向量列表,如果发现哪个软中断向量被挂起了( pend ),就执行对应的处理函数,对于 tasklet 来说,此处理函数就是 tasklet_action ,这个处理函数在系统启动时初始化软中断的就挂接了。
Tasklet_action 函数,遍历一个全局的 tasklet_vec 链表(此链表对于 SMP 系统是每个 CPU 都有一个),此链表中的元素为 tasklet_struct 。此结构如下 :
struct tasklet_struct
{
       struct tasklet_struct *next;
       unsigned long state;
       atomic_t count;
       void (*func)(unsigned long);
       unsigned long data;
};
每个结构一个函数指针,指向你自己定义的函数。当我们要使用 tasklet ,首先新定义一个 tasklet_struct 结构,并初始化好要执行函数指针,然后将它挂接到 task_vec 链表中,并发一个软中断就可以等着被执行了。
原理大概如此,对于 linux 驱动的作者其实不需要关心这些,关键是我们如何去使用 tasklet 这种机制。
Linux 中提供了如下接口:
DECLARE_TASKLET(name,function,data) :此接口初始化一个 tasklet ;其中 name 是 tasklet 的名字, function 是执行 tasklet 的函数; data 是 unsigned long 类型的 function 参数。
static inline void tasklet_schedule(struct tasklet_struct *t) :此接口将定义后的 tasklet 挂接到 cpu 的 tasklet_vec 链表,具体是哪个 cpu 的 tasklet_vec 链表,是根据当前线程是运行在哪个 cpu 来决定的。此函数不仅会挂接 tasklet ,而且会起一个软 tasklet 的软中断 , 既把 tasklet 对应的中断向量挂起 (pend) 。
两个工作完成后,基本上可以了, tasklet 机制并不复杂,很容易的使程序尽快的响应中断,避免造成中断丢失。


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/aimbin/archive/2007/03/21/1536568.aspx

细说Linux内核中断架构 中断和异常 一、什么是中断?         中断通常被定义为一个事件,该事件改变处理器执行的指令顺序。这样的事件与CPU芯片内外部硬件电路产生的电信号相对应。         中断通常分为同步中断和异步中断: 2  同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。         ◎ 异步中断是由其他硬件设备依照CPU时钟 阅读详情

相关推荐

软中断技术与Bootloader实现详解

在开始之前,我们需要了解嵌入式系统开发的基本概念和开发流程。

weixin_31974443的博客 809

同步中断与异步中断

中断是指强制改变了cpu指令执行顺序的一些事件,所谓改变指令执行顺序,首先可以理解为没有到进程调度点就暂停了下一条指令的执行转而执行中断的指令,其次可以理解为 同一进程内原本相邻的两条指令间穿插了其它指令的执行。 同步中断是由cpu内部的电信号产生的中断,其特点为当前执行的指令结束后才转而产生中断,由于有cpu主动产生,其执行点必然是可控的。 异步中断是由cpu的外设产生的电信号引起的中断,

Gary_tian的博客 6455

使用 ANSYS AEDT(双向耦合)对高功率射频同轴滤波器进行热分析

使用 ANSYS HFSS,可以精确计算 EM 损耗,然后将其导入 ANSYS 热分析并使用 ANSYS Icepak CFD 求解器进行仿真,以帮助工程师解决最复杂的热挑战,并预测其设计在温度变化下的表现。然后,RF 损耗将与 ANSYS Icepak CFD 求解器耦合,以执行热分析,包括传热的传导、对流和辐射模式,并计算温度曲线。在此演示中,我们将仿真下面的 RF 同轴滤波器,并计算由于所用材料的有限电导率和介电损耗而导致的 RF 传导损耗。设置 HFSS 设计后,我们可以开始 HFSS 仿真。

jkh920184196的博客 1050

内中断,外中断,软中断,硬中断,异常,陷阱

不管是内中断,外中断,软中断还是硬中断都是按照中断源来划分的。 一、外中断 狭义上的中断(interruption)指的就是外中断。 指来自CPU执行指令以外的事件的发生,希望处理机能够向设备发下一个输入/输出请求,同时让完成输入/输出后的程序继续运行。 简单来讲,就是外设请求或人为干预等当前执行指令之外的因素所引起的中断。 二、内中断 内中断也常称作异常(exception),指的是CPU执行当前指令时所发生的中断,一般分为两种: 1.自愿中断。比如当前执行的是trap指令。 2.强迫中断。即当前指令在执

qq_40010871的博客 2万+

RT-Thread代码启动过程——以及 $Sub$ $main 与 $Super$ $main

我们找到系统复位的地方,可以往下单步跟踪。 ①从系统初始化开始执行,将函数地址赋给R0寄存器,跳转到R0地址执行并返回此处(BLX是带链接的跳转,即带返回的跳转)。 ②将main函数地址给R0,将函数地址赋给R0,跳转到R0地址执行,不返回(BX是跳转,不返回)。 ③跳转到了$Sub$$main。 【注:在 __CC_ARM 编译器环境下,使用了$Sub$$ 与$Super$ $ 的...

yang1111111112的博客 1万+

基于Godot 4的战术RPG开发:模块化架构与核心系统实现

在游戏开发领域,模块化架构和回合制战斗系统是构建复杂策略游戏的基础。模块化设计通过关注点分离,将游戏逻辑分解为独立、可复用的组件,如数据模型、功能模块和场景,从而提升代码的可维护性和扩展性。回合制战斗系统则依赖于清晰的状态机循环,管理从单位选择、行动决策到伤害结算的完整流程,这是策略游戏体验的核心。这些技术为独立开发者提供了高效起点,能快速验证游戏原型。本文聚焦于一个专为Godot 4引擎设计的开源战术RPG模板,它正是运用了模块化架构和回合制状态机,实现了网格移动、相机控制和基础AI等核心功能。该模板通过

weixin_27021789的博客 614

Java程序员应该掌握的底层知识】 06 中断

文章目录中断软中断(80中断/80H)java中读取文件的例子从一个简单的汇编程序来理解软中断 中断 中断是和操作系统内核通信的一种机制,它本身也是一种信号,举个例子,一个应用程序运行过程中出现了卡顿,此时CPU在全力执行这个程序的进程,我们想通过键盘或者鼠标的某个按键来告诉操作系统将这个进程进行关闭(也就是想通过硬件的操作来让软件有个反馈),此时就需要用到中断,也就是说发送了一个紧急信号,希望内核命令应用程序可以停下手头的工作,然后优先进行处理我的某个操作。 中断分为硬中断和软中断,我们上面描述的例子,

永无止境 571

Windows 10/11 零基础配置 SillyTavern 连接 Claude API 完整指南(含 Node.js 环境搭建)

本文提供Windows 10/11系统下零基础配置SillyTavern连接Claude API的完整教程,涵盖Node.js环境搭建、SillyTavern初始化及API连接配置等关键步骤。通过详细的操作指南和实用技巧,帮助用户快速搭建AI聊天界面并优化对话体验,实现与Claude AI的高效交互。

weixin_30642561的博客 134

硬中断 与 软中断

硬中断(hardirq)是由外部硬件设备(如网卡、硬盘、键盘)自动产生的电信号,用于通知操作系统外设状态的变化。它属于异步中断,发生时间随机,无法预测。特点包括:中断号由中断控制器(如APIC)提供;可通过函数如屏蔽;处理程序需快速执行,称为“上半部”,以避免阻塞系统;支持中断嵌套(除相同类型外)。注册方式通常通过函数,处理函数返回等状态。软中断(softirq)是通过软件指令(如int)触发的机制,主要用于在硬中断后延迟执行耗时任务,属于中断处理的“下半部”。

weixin_43202230的博客 1336

【WRF-Chem】预处理工具(Preprocessors)总结

预处理工具(Preprocessors)总结

WW、forever的博客 1179

【学习系列】SAP RAP 20:Unmanaged场景开发示例-调用BAPI、BAPI包装类、BO接口创建标准采购订单

本文介绍了在SAP RAP(Restful ABAP Programming)框架下,通过三种方式实现采购订单创建的方案。首先分析了RAP框架对传统BAPI调用的限制,特别是禁止显式COMMIT语句的要求。随后详细阐述了三种实现方式:1)直接调用传统BAPI(仅支持OP环境);2)使用BAPI包装类(仅支持OP环境);3)调用标准业务对象接口(支持所有环境)。 文章重点说明了在unmanaged场景下的技术实现细节,包括字段控制、缓冲区管理、测试运行与实际调用的分离处理等。针对每种方式都提供了完整的实施步骤

DeveloperMrMeng的博客 598

硬中断与软中断的区别

摘自:https://blog.51cto.com/noican/1361087 硬中断: 1. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。 2. 处理中断的驱动是需要运行在CPU上的,因此,当中断产生的时候,CPU会中断当前正在运行的任务,来处理中断。在有多核心的系统上,一个中断通常只能中断一颗CPU(也有一..

自主无人机 PX4 ROS SLAM 路径规划 MVS等技术分享 1730

(持续更新中!)详解【计算机类&面试真题】军队文职考试 ——第二期(真题+解析)| 网络协议的三个核心要素;交互式系统中的非剥夺策略;中断和陷入的区别;可变分区管理中的硬件机制;数据库系统的优点

本篇博客将讨论军队文职面试(计算机类)的几个关键问题。我们将介绍网络协议的核心要素(帮助你理解网络通信的基本原理)、交互式系统中的非剥夺策略(解释为何这是一个优秀的策略以及其对用户体验、系统稳定性和可预测性的影响)、中断和陷入的区别(从引起原因、处理机制、权限级别和应用等方面进行阐述)、可变分区管理的硬件机制以及数据库系统与文件系统的优点比较。通过阅读本文,您将深入了解这些话题,为面试准备和实际应用提供有价值的知识。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1705

软中断与软件中断

软中断与软件中断

holly的专栏 3194

【Agent从入门到实践】40 容错优化:异常处理、重试机制、降级策略

各位小伙伴,咱们的多Agent框架一路优化到现在,决策快、执行效率高、资源用得省,看似啥都行,但只要一遇到网络波动、工具故障、数据异常调用web_search工具时网络超时,整个检索任务直接失败,写作Agent没数据可用向量库连接异常,向量检索直接崩掉,依赖检索结果的Agent全趴窝单个Agent执行出错,整个并行任务流程直接中断,前功尽弃高并发下部分工具调用失败,框架没有备用方案,只能返回任务失败说白了,咱们之前的框架只有正常执行逻辑,没有异常兜底逻辑。

人工智能AI技术 909

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

linux软中断与tasklet

原文地址:http://blog.youkuaiyun.com/rockrockwu/article/details/7315677 软中断 软中断由 struct softirq_action{ Void(*action)(struct softirq_action *) } 表示。并且当前内核中的软中断总数固定为32个,由数组Static struct so

雜貨鋪 708

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

软中断与tasklet简介

软中断 tasklet 中断下半部

qq_45577173的博客 1813

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

linux 软中断与硬中断

Linux内核中软中断(Softirq)和硬中断(Hardware IRQ)是两类完全不同的中断机制。硬中断由硬件设备触发,用于通知CPU外设事件,执行时立即响应且必须快速完成;软中断是内核软件层面的异步任务调度机制,由内核代码触发,用于延后执行耗时任务。两者协同工作形成"顶半部+底半部"处理模式:硬中断处理紧急操作,软中断完成后续任务。关键区别在于触发源(硬件vs软件)、执行时机(立即vs延后)和并行性(串行vs并行)。开发者可通过/proc/interrupts和/proc/soft

tangzhangyin的专栏 632

CPU软中断概念与案例

CPU软中断概念&案例 1 案例一 1.1 环境部署 环境1:WEB服务器 docker run -itd --name=nginx -p 80:80 nginx 环境2:SYN攻击 curl http://xxx.xxx.xxx.xxx/ <!DOCTYPE html> <html> <head> <title>Welcome to ng...

InternalsOf 1802

软中断与Bottom Half

/* * Exit an interrupt context. Process softirqs if needed and possible: */ void irq_exit(void) { account_system_vtime(current); trace_hardirq_exit(); sub_preempt_count(IRQ_EXIT_OFFSET); if (!in

SunnyBeiKe的专栏 2983

软中断与硬中断

①硬中断是由外部事件引起的因此具有随机性和突发性;软中断是执行中断指令产生的,无面外部施加中断请求信号,因此中断的发生不是随机的而是由程序安排好的。 ②硬中断的中断响应周期,CPU需要发中断回合信号(NMI不需要),软中断的中断响应周期,CPU不需发中断回合信号。 ③硬中断的中断号是由中断控制器提供的(NMI硬中断中断号系统指定为02H);软中断的中断号由指令直接给出,无需使用中断控制器。

818

[Linux内核]软中断与硬中断

转自:http://blog.youkuaiyun.com/zhangskd/article/details/21992933 本文主要内容:硬中断 / 软中断的原理和实现 内核版本:2.6.37 Author:zhangskd @ csdn blog 概述 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。 如果中断的...

anxuan3201的博客 195

软中断与硬中断区别

区别有好几点,不过可能我总结得不全面     1.软中断发生的时间是由程序控制的,而硬中断发生的时间是随机的     2.软中断是由程序调用发生的,而硬中断是由外设引发的     3.硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等侍较长时间     编写这两类的中断处理程序我感觉区别不太大

dadalan的专栏 4392

linux软中断 区别,软中断与硬中断之间的区别是什么?

软中断与硬中断之间的区别是:1、硬中断是由外部事件引起的因此具有随机性和突发性;软中断是执行中断指令产生的,无外面事件中断请求信号,因此软中断的发生不是随机的而是由程序安排好的。2、硬中断的中断号是由中断控制器提供的(NMI硬中断号系统指定的为02h);软中断的中断号是由指令直接给出的,无需使用中断控制器。3、硬中断的中断响应周期,CPU需要发中断回合信号(NMI不需要),软中断的中断响应周期,C...

weixin_32578799的博客 560
上一篇: 使用 watchdog 构建高可用性的 Linux 系统及应用
下一篇: bus,device,driver三者关系
control_tech
博客等级 码龄17年 53粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值