Linux学习——Linux的异常处理

拆开一个烧坏的IGBT模块,手把手教你识别过压、过流、过温的“案发现场” 本文详细解析了IGBT模块失效分析的实战技巧,通过观察铝层熔化纹路、焊锡溢出形态等物理痕迹,手把手教你识别过压、过流、过温的典型失效模式。文章提供了从基础工具包到现场快速诊断的完整流程,帮助工程师精准定位IGBT模块失效的根本原因。 阅读详情

在Linux内核的配置文件.config文件中可以知道Linux内核使用ARM架构CPU的异常向量基址为0xFFFF0000。

1.内核对中断的处理流程

arch/arm/kernel/entry-armv.S

__vectors_start:@异常向量
	swi	SYS_ERROR0
	b	vector_und + stubs_offset
	ldr	pc, .LCvswi + stubs_offset
	b	vector_pabt + stubs_offset
	b	vector_dabt + stubs_offset
	b	vector_addrexcptn + stubs_offset
	b	vector_irq + stubs_offset
	b	vector_fiq + stubs_offset

异常向量表,无非还是一些跳转指令。当发生irq中断,执行指令“b vector_irq + stubs_offset”,也就是跳转到vector_irq代码段继续执行。

阅读该文件时,注意到每一个异常处理时开头都有一段相似的代码,比如:

vector_stub	irq, IRQ_MODE, 4
vector_stub	dabt, ABT_MODE, 8
vector_stub	pabt, ABT_MODE, 4

vector_stub是一段宏,展开来则是:

	.macro	vector_stub, name, mode, correction=0
	.align	5

vector_\name:
	.if \correction
	sub	lr, lr, #\correction @计算返回地址
	.endif

	@ 保存现场
	@ Save r0, lr_<exception> (parent PC) and spsr_<exception>
	@ (parent CPSR)
	@
	stmia	sp, {r0, lr}		@ save r0, lr
	mrs	lr, spsr
	str	lr, [sp, #8]		@ save spsr

	@ 转换到管理模式
	@ Prepare for SVC32 mode.  IRQs remain disabled.
	@
	mrs	r0, cpsr
	eor	r0, r0, #(\mode ^ SVC_MODE)
	msr	spsr_cxsf, r0

	@ 跳转指令,根据跳转表实现
	@ the branch table must immediately follow this code
	@
	and	lr, lr, #0x0f
	mov	r0, sp
	ldr	lr, [pc, lr, lsl #2]
	movs	pc, lr			@ branch to handler in SVC mode
	.endm

跳转表(以中断为例):

vector_stub	irq, IRQ_MODE, 4

	.long	__irq_usr			@  0  (USR_26 / USR_32)
	.long	__irq_invalid			@  1  (FIQ_26 / FIQ_32)
	.long	__irq_invalid			@  2  (IRQ_26 / IRQ_32)
	.long	__irq_svc			@  3  (SVC_26 / SVC_32)
	.long	__irq_invalid			@  4
	.long	__irq_invalid			@  5
	.long	__irq_invalid			@  6
	.long	__irq_invalid			@  7
	.long	__irq_invalid			@  8
	.long	__irq_invalid			@  9
	.long	__irq_invalid			@  a
	.long	__irq_invalid			@  b
	.long	__irq_invalid			@  c
	.long	__irq_invalid			@  d
	.long	__irq_invalid			@  e
	.long	__irq_invalid			@  f

总结: 在linux内核初始化阶段,start_kernel函数(init/main.c)会调用trap_init、init_IRQ两个函数来初始化异常向量相关处理函数。并构造异常向量表__vectors_start,当发生中断时跳转至vector_irp(用宏来实现),在里面实现保存现场、计算返回地址、转换至管理模式、调用处理函数:以用户模式下的中断为例

__irq_usr:
    usr_entry             @将usr模式下的寄存器、中断返回地址保存到堆栈中    //保存现场

    get_thread_info tsk  @获取当前进程的进程描述符中的成员变量thread_info的地址,并将该地址保存到寄存器tsk等于r9

    irq_handler          @中断处理    //宏

    mov    why, #0       
    b    ret_to_user     @中断处理完成,返回中断产生的位置

irq_handler是一个宏,展开来是:

.macro    irq_handler
  get_irqnr_preamble r5, lr
1:    get_irqnr_and_base r0, r6, r5, lr
    movne    r1, sp
    adrne    lr, 1b
    bne    asm_do_IRQ
   .endm

进入asm_do_IRQ函数开始具体的中断处理。需要指出的是,asm_do_IRQ是中断的C语言总入口函数。

2.asm_do_IRQ函数

smlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)

开始执行之后,

struct irq_desc *desc = irq_desc + irq;

从名字上可以知道,irq_desc是一个中断描述数组,以中断号为下标,

之后进入处理函数:

static inline void desc_handle_irq(unsigned int irq, struct irq_desc *desc)
{
    desc->handle_irq(irq, desc);
}

该函数所做的是分辨是哪一个中断、调用对应的处理函数、清除中断标志位

搜索handle_irq,发现handle_irq被__set_irq_handler调用过
搜索__set_irq_handler,发现__set_irq_handler被set_irq_handler调用过
搜索set_irq_handler,发现__set_irq_handler被s3c24xx_init_irq(void)调用过
 

中断处理 C 函数入口 “asm_do_IRQ”会调用到事先初始化好的“handle_irq”函数。

handle_irq == handle_edge_irq,将执行:

①desc->chip->ack(irq):清除中断

②handle_IRQ_event:取出action链表中的成员,执行action->handler

3.request_irq( )函数

int request_irq(unsigned int irq, irq_handler_t handler,
		unsigned long irqflags, const char *devname, void *dev_id)

用于注册用户编写的中断处理函数,里面将执行:

①分配irqaction结构

②setup_irq(irq,action):

       在irq_desc(irq)->action链表里加入传入的irq、action,

       在desc->chip->settype里将引脚设置为中断引脚

       在desc->chip->sturtup/enable里使能中断

4.free_irq( )函数

void free_irq(unsigned int irq, void *dev_id)

用于卸载用户编写的中断服务程序。会执行出链、除能中断

写完驱动代码之后,使用命令exec /5</dev/buttons打开中断驱动即可,就是打开这个设备,定位到5处

想关闭则使用命令exec 5<&-

5.休眠与唤醒

使用休眠功能,可以将程序的CPU占有率降低至2%,大大提高了性能。

在中断服务函数里面:
ev_press = 1;       /* 有按键按下 */
wake_up_interruptible(&button_waitq);   /* 唤醒休眠的进程 */

在驱动的read函数里面:
wait_event_interruptible(button_waitq, ev_press);

/* 返回数据给内核 */
copy_to_user(buf, &key_val, sizeof(key_val));
ev_press = 0;

按键按下后,进入中断服务函数执行一系列操作并唤醒休眠的进程,执行完毕之后程序将从休眠处继续执行。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

深入探索 SEED-VII:情感脑电图研究的新利器 SEED-VII是上海交通大学最新发布的多模态情感脑电图数据集,在传统EEG数据基础上增加了眼动、生理信号等多维信息,支持更精细的情感识别研究。该数据集提供了丰富的情感维度标注(效价和唤醒度),可用于算法基准测试、跨模态情感融合及个性化模型开发等研究场景。在应用层面,SEED-VII可推动人机交互、心理健康监测、教育娱乐等领域的情感计算技术发展。文章还提供了PyTorch加载该数据集的代码示例,为研究者使用该数据集提供了技术参考。 阅读详情

相关推荐

nbiot和2g_浅谈NBIOT

一、什么是NBIOT?1、概念窄带物联网(Narrow Band Internet of Things, NB-IoT),NB-IoT构建于蜂窝网络,只消耗大约180KHz的带宽,使用License频段,可采取带内、保护带或独立载波等三种部署方式,与现有网络共存。可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。2、NBIOT的特点和目标(1)超强覆盖:相对GPRS来...

weixin_39534100的博客 1704

Linux异常体系之vector_stub宏解析

ARM-Linux汇编的宏定义语法说明如下: 使用注意: 1.宏定义以.macro开始,以.endm结束 2.可带参数,参数可有默认值 3.直接使用参数的名字\arg vector_stub宏的功能: 计算处理完异常的返回地址; 保存寄存器(r0,lr,spsr) 进入管理模式; 最后根据进入异常前的模式跳转到相应的某个分支。 1 /* 2 *...

akws806200的博客 578

SAP 对接CBS(http方式)

CLEAR:lv_xml_crc32_string. CONCATENATEcrc32_passwordcrc32_keyi_stringINTOlv_xml_crc32_string. CONDENSElv_xml_crc32_string. CALLFUNCTION'SCMS_STRING_TO_XSTRING' EXPORTING text=lv_xml_crc32_string encoding='8400' "GB...

3597

Linux异常(中断)处理体系结构

通过上面的分析我们大致弄明白了ARM架构下Linux整个的异常处理流程。Linux系统启动时,会在函数中调用一些列初始化函数包括trap_init函数。trap_init函数完成的工作将中断向量表拷贝到0xffff0000处,这个地址是我们在编译内核时指定的。也不一定是0xffff0000,根据不同的芯片可能会选择中断向量表的存放地址。例如s3c2440芯片就规则了中断向量表存放的地址为0x00000000或0xffff0000两个地址,通过配置寄存器来选择不同的地址。...

Bin_Watson的博客 2075

el-transfer和el-tree进行结合搞一个树形穿梭框

由于业务需求需要在穿梭框里使用树形结构,但是本身element里并不支持,于是参考了别的大佬发的文章作为思路及后续自己新增了一些处理功能。

bbkhhvv的博客 6306

人工智能,不止于模型:四步实现完整工作流

工程师越来越多地致力于将人工智能 (AI) 集成到自己的项目和应用中,同时不断着力提升自己的 AI 技能。面对 AI 问题,工程师首先要了解什么是 AI,以及如何将它纳入当前工作流,这看似简单,实则未必容易。在 Google 中搜索“什么是 AI?”会得到数百万条结果,包括不同程度的技术和相关信息。那么,对工程师而言,AI 意味着什么?人们对 AI 的关注主要集中在 AI 模型上,受此影响,工程师会迅速投入 AI 建模的研究。

r1832644594的博客 2815

linux对中断向量的处理

a.异常向量入口:(linux-4.19-rc3\arch\arm\kernel\entry-armv.S) .section .vectors, "ax", %progbits .L__vectors_start: W(b) vector_rst W(b) vector_und W(ldr) pc, .L__vectors_start + 0...

yogach的博客 934

一文搞定 GitHub SSH Key:生成、配置、好处全攻略

本文详细介绍了如何配置GitHub SSH Key,实现免密安全认证。主要内容包括:SSH协议的四大优势(免密登录、安全性高、稳定省心、支持自动化);Git身份配置步骤;检查本地SSH Key;生成RSA密钥对;添加密钥到SSH代理;复制公钥到GitHub;测试连接。配置完成后,开发者可通过SSH地址克隆仓库,实现push/pull全程免密操作。该方案显著提升Git使用效率,同时保障安全性,是开发者必备技能。

qq_62904883的博客 958

ARM中断向量表与响应流程

一首先中断向量表定义在哪里?如何加载?  二  中断向量表与中断服务程序 三处理流程 //////////////////////////////////////////////////////////////////////////////////////////////////// 一首先中断向量表定义在哪里?__vectors_start 首先中断向量表定义的是什么? 定义

jet 2万+

统计信号处理基础 习题解答1-1

1-1:在雷达习题中,双程延时时间的估计量具有PDF τ0~Nτ0,στ02,其中τ0是真值。假如要估计距离请提出一种估计量R,并求它的PDF。然后,确定标准偏差στ0,使得距离估计值的99%在真值的100m以内,对电磁波传播速度取c=3×108m/s。 解答: 问题1: 由于电磁波传播速度c,信号可观察的双程传播延时τ0和双程传播距离τ0满足关系: R=cτ02 因此可采用如下估计量: R=cτ02 问题2: 由于τ0满足正态分布,且: Eτ0=τ0 varτ0=στ02 那么: E

weixin_43270276的博客 2806

Cesium 实战 28 - 三维视频融合(视频投影)

Cesium 实战 27 - 三维视频融合(视频投影)。

非科班Java出身GISer的博客 3368

LINUX-内核-中断分析-中断向量表(3)-arm

arm中断概念在《ARM体系结构与编程》第9章中说到,ARM 中有个概念叫做“异常中断”,也就是包括外部中断在内的各种异常。显然,ARM体系的“异常中断”概念更加接近MIPS体系中的“异常”概念。 既然更类似MIPS体系,那么自然的ARM体系就存在“异常中断入口”和“异常中断向量表”的概念。arm的异常中断向量表非向量化中断ARM体系定义了7种异常中断,在《ARM体系结构与编程》第9章的表9.

liangll的博客 6882

基于强化学习的多无人机路径规划

我们使用了Dueling Double Deep Q-Network(DDDQN)算法来训练智能体,这个算法在深度Q学习算法的基础上进行了升级,具有更快的收敛速度和更好的性能。本文提出了一种基于强化学习的算法,实现了多无人机路径规划,并提供相应的MATLAB代码。通过基于强化学习的多无人机路径规划算法,我们能够高效地解决复杂环境下的任务需求,并在实际应用中取得了良好的效果。首先,我们定义了状态空间和动作空间。实验结果表明,我们的方法能够有效地解决多无人机路径规划问题,提高了任务完成的效率和准确率。

DjjPython的博客 820

Linux 内核学习(6) - 中断和异常处理

中断的硬件背景 IOAPIC:所有外设都会连接到IOAPIC引脚上面 基本的配置方法 IOREGSEL: 用来选择配置的功能 IOWIN: 用来读取更改具体的配置项 配置功能选项 IOAPICID: 唯一标识 IOAPICVER: 版本识别 IOAPICARB: 用于发送信息的仲裁,按优先级轮转自动转换 IOREDTBL: 0~23条中断线的配置 中断向量号 bit 0~7 传送中断的模式 指定目标CPU 禁用启用中断线 几个状态位 中断流程 连接IOAPIC引脚的设备触发中断 检

一个幽灵 588

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Python学习笔记——3、json、Linux命令、异常处理的基本应用

1、json 我的理解是python和JavaScript进行数据交换的格式转换的函数库。 主要用到的几个函数; 1)json.dumps() #编码,其中包含一些参数,可以进行调整,从而进行格式化转换,主要是将python的一些格式类型转换成json的string格式。 2)json.loads() #解码,主要功能是将json转换成python的对象,从而进行后续处理,一般为字典型 2、Linux基本命令 (1) ls:将整个文件夹的文件名进行遍历输出 .

靡不有初 鲜克有终 1806

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

linux内核数据异常处理,Linux内核学习笔记:中断与异常

四. 异步中断异步中断,当前进程是无效的。异步中断分为:IO中断,时钟中断,处理器之间中断。下面重点学习linux的IO中断处理。所有中断处理程序都执行四个相同的工作。(1)在内核态保存IRQ的只和寄存器的值(2)应答中断(3)执行这个IRQ的所有中断服务例程。(4)中断返回IRQ基本的数据结构为irq_desc_t,每一个IRQ都有一个这样的数据结构。这个数据结构包括:操作可编程中断控制器的方法...

weixin_35604021的博客 298

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【python零基础入门学习】python进阶篇之时间表示方法和异常处理以及linux系统的os模块执行shell命令以及记账程序编写教学(一)_python strftime函数异常处理

最全的Linux教程,Linux从入门到精通第一份《Linux从入门到精通》466页内容简介====本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。

m0_60388261的博客 980

linux 学习计划

开始学习linux要做好计划1.熟悉linux启动过程 3月最后一周 2.熟悉shell脚本编写,linux维护 4月第一周3.熟悉linux网络编程以及异常处理  4月第二周---第三周4.熟悉linux设备驱动程序加载过程  4月第四周5.熟悉linux设备驱动程序编写方法  5月第一周 ---- 5月第三周坚持!!!

DanielLee_ustb的专栏 1951

Linux系统学习笔记(安装软件和异常处理)

Linux系统下怎么安装.deb文件? deb 是 ubuntu 、debian 的格式。 .deb是solaris系统下的安装包后缀名。安装方法如下 cd 到安装包的目录 dpkg(空格)-i(空格)安装包名字 注:一般需要在指令前加sudo 安装过程中出现异常,详细信息如下: dpkg status database is locked by another

灵云山的博客 545

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno,如socket(), bind(), accept(), listen()。erron存放一个正整数来保存上次出错的错误值。 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题。 慢系统调用 指可能永远阻塞而无法返回的系统调用,通常是一些读写的例子,如pipe,终端设备,网络连接,典

simon、夏不弃疗 2421

【python零基础入门学习】python进阶篇之时间表示方法和异常处理以及linux系统的os模块执行shell命令以及记账程序编写教学(一)

【python零基础入门学习】python进阶篇之时间表示方法和异常处理以及linux系统的os模块执行shell命令以及记账程序编写教学(一)

zerotoall的博客 323

Linux内核学习轨迹第五部:缺页异常处理全链路深度解析(第七小节)

当进程访问的虚拟地址没有建立页表映射,或者访问权限不匹配时,CPU会触发缺页异常,陷入内核,由内核的缺页异常处理函数完成物理内存分配、页表映射、权限调整等操作,异常处理完成后,CPU重新执行触发异常的指令。当进程访问文件映射的虚拟地址,对应的文件页不在页缓存中时,触发文件映射缺页异常,由do_fault()函数处理,通常是主缺页异常,需要访问磁盘。缺页异常处理时,如果系统没有足够的空闲内存,内核会先触发内存回收,如果回收后还是没有足够的内存,会触发OOM Killer,杀死进程释放内存。

新时代农民工 327

linux学习笔记

unix是一个强大的多用户、多任务操作系统,支持多种处理器架构Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。GNU是一个操作系统,其内容软件完全以GPL方式发布。这个操作系统是GNU计划的主要目标,名称来自GNU's Not Unix!

nanyixiayan的博客 737

超详细的Java入门到精通完整学习教程,学Java一定得收藏。

从 1995 年第一个版本发布到现在,Java 语言已经在跌宕起伏中走过了 26 年,最新的 Java 版本也已经迭代到 Java 16。 java是有一个庞大的生态系统,它的覆盖范围非常广,而且已经连续十几年位居开发语言的榜首,所以java是相对于其他语言来说,非常稳定的。 JAVA市场 java有非常广泛的应用市场,它的生态系统几乎涵盖了目前市面上所有的软硬件,java几乎是万能的,你能想到的,java基本都能实现(虽然吹的有点大,但不可否认)。 web开发: 能做大型的互联网网站如,京

hnityyds的博客 4366

【Linux学习周记#0】9.21-9.22

中央民族大学大一新生,入学后自言自语记录Linux学习历程的第零周( º﹃º )为什么是第零周呢?因为我本周正式开始Linux的学习时的时候,已经是周六晚上了,实在说不上是完整的一周。这一整周基本都在为学委竞选的事辗转反侧,破烂不堪的发言稿和ppt被我缝缝补补。不过最后成功竞选了,还是很开心的hhh现阶段读书心得:还是看不懂思密达(´◔​∀◔`)路漫漫其修远兮,为了进步,还是边查找相关资料,边慢慢,慢慢,慢慢地看了......对了,似乎以后还会频繁地提及这位大佬兄长,干脆叫他“佬兄”算了(?

Eustiawhite的博客 641

Linux环境下的C/C++开发学习之旅

在当今软件开发领域,C和C++作为底层与系统级编程的重要语言,在Linux操作系统环境下具有极高的应用价值。在学习过程中,动手实现一些小型项目,如文件复制程序、简单的HTTP服务器、多线程并发任务调度器等,可以帮助你巩固所学知识,并对Linux环境下的C/C++开发有更深入的理解。:掌握Linux下的套接字编程,包括TCP/IP协议栈的理解,socket API的使用,以及并发服务器模型的设计。:C++引入了类、对象、继承、封装、多态等面向对象特性,这是C++区别于C的重要部分,需要深入理解和熟练运用。

LinuxTaoist的博客 771
上一篇: Linux学习——查询方式的按键驱动
下一篇: Linux学习——poll机制
R/W
R/W
博客等级 码龄8年 93粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值