arm linux下的中断处理过程。
本文基于ast2600 soc来阐述,内核版本为5.10
1.中断gic初始化
start_kernel() -> init_IRQ() -> irqchip_init()

![]()





of_irq_init()主要是构建of_intc_desc.
489-514: 从__irqchip_of_table中找到dts node中匹配的of_table(匹配matches->compatible),
然后申请desc, 保存匹配的of_table数据到desc,最后将desc插入intc_desc_lis中
521-541:调用desc->irq_init_cb.
我们先来看看这个of_table(__irqchip_of_table)有哪些数据。
这个__irqchip_of_table在arch/arm/kernel/vmlinux.lds申明了是在.init.data section中。

那么这个位置放置了些什么数据?
__irqchip_of_table中的数据由IRQCHIP_DECLARE()来声明和定义。
![]()


在我的板子上(arm cortex a7)的__irqchip_of_table数据如下:


所以,desc->irq_init_cb就是gic_of_init().
start_kernel() -> init_IRQ() -> irqchip_init() -> of_irq_init() -> gic_of_init()

gic_of_init()调用__gic_init_bases()去设置各种处理函数。比如设置handle_arch_irq为gic_handle_irq().



gic_init_chip()会设置irq_mask等函数,定义如下:

2. exception vector table.
Arm手册上说了,vector的地址有两个,一个是0,另一个是0xFFFF0000.

Arm linux实现时,vector设置的地址为0xFFFF0000.
start_kernel() -> setup_arch() -> paging_init() -> devicemaps_init()



![]()
devicemaps_init()调用early_trap_init()将异常向量表vector数据拷贝到vectors,然后将vectors映射到异常向量表地址0xffff0000。
我们继续看看异常向量表的定义__vectors_start.
![]()
__vectors_start放在.vectors section中。
.vectors段中定义的数据如下:

这个就是arm手册上定义的异常向量表的顺序:

对于普通中断,就是vector_irq.



vector_irq先保存现场数据:
1014-1016:保存r0, lr到栈sp,保存spsr到sp
1021-1023:设置ABORT模式。
1032-1033: lr为spsr的低4位,即表示中断前是什么mode(irq,fiq,svc等),然后加载异常
处理函数(pc + (mode << 2))指令,pc为当前指令地址+8(armv7为3级流水线)。
如果,中断前是user模式,mode(如下表)为0b10000,则对应的处理函数为
pc + (0b10000 & 0xf) << 2 = pc+0, 即为__irq_usr;
如果,中断前是svc模式,则这里对应的处理函数为
pc + (0b10011 & 0xf) << 2 = pc + 0b11<<2=pc + 12,即__irq_svc.

__irq_usr和__irq_svc都调用irq_handler处理中断。


irq_handler是一个宏。

irq_handler这个宏就是调用handle_arch_irq, 这个处理函数就是前面初始化介绍过在start_kernel() -> init_IRQ() -> irqchip_init() -> of_irq_init() -> gic_of_init() ->__gic_init_bases() -> set_handle_irq()的注册的函数gic_handle_irq().

gic_handle_irq()先读取interrupt ACKnowledge register(GIC_CPU_INTACK),这个读取操作就是ACK interrupt, 之后(362行), 写GIC_CPU_EOI告知GIC,本次中断处理完成,可以再次接受这个irq的中断。
然后调用handlr_domain_irq() -> __handle_domain_irq() -> generic_handle_irq() -> generic_handle_irq_desc() -> desc->handle_irq()

对于ast2600 MAC来说,这个desc->handle_irq()就是ftgmac100_interrupt().



ftgmac100_interrupt()在最后调用napi_schedule_irqoff()去raise一个NET_RX_SOFTIRQ中断。这个软中断会调用ftgmac100的napi函数ftgmac100_poll()去读取网卡上的数据,并递交给协议栈。




那么,相同irq号的中断可以嵌套吗?高优先级的irq可以抢占低优先级已经ack但未EOI的中断吗?
Arm手册的描述如下:






按arm手册描述,当某个irq中断发生时,GIC distributor将该interrup设置为pending状态,并按优先级将该中断发送到 GIC cpu interface. GIC cpu interface再选最高优先级的Interrupt,然后向cpu发起中断,并将Interrupt设置为active状态。
当cpu正在处理一个interrupt(已经ack, 但为EIO)时,如果来了一个高优先级中断,那么这个GIC cpu interrupt还是可以向cpu发送中断信号,以抢占中断处理。如果是相同优先级的中断,则不能抢占。
从gic_handle_irq()的实现来看,中断处理的上半部(驱动注册的中断处理函数),可以被高优先级中断抢占,当同优先级的中断则不能抢占。
所以:
相同优先级的不同中断,不能抢占正在处理的中断;
高优先级的中断,可以抢占当前正在处理的中断;
当前正在处理的中断再次发生中断,也不能抢占中断,当前中断状态会进入"active and pending"状态。
// update information
在armv7中,gic初始化的时候,将中断号32开始的所有中断的优先级设置为相同的,为0xa0, 中断号0-31预留给CPU使用,
所以,在armv7中,所有外设的中断都是相同优先级,外设中断不会有中断抢占。



在armv7的DTS中,描述interrupt有三个数字,第一个标识interrupt type, 第二个标识interrupt number, 第三个标识flags,如下图。DTS中不存在配置中断优先级操作。

上面说的这些都是在中断发生时,cpu不屏蔽中断的前提下,实际上,在armv7的实现时,在vector_irq中,cpsr.I位并没有清零,保持为1,这表示arm禁了中断,所以,无论怎么样,当irq_handler处理完后,无论是__irq_svc还是__irq_usr,在返回中断前时,spsr的值才会去更新cpsr,也就是enable irq.(svc模式下的内核抢占发生时,会主动设置cpsr的I位,即enable IRQ).
可见,arm 中断整个过程,IRQ都是被cpsr关闭的。直到处理完才enable.(svc内核抢占和softirq处理时会主动打开IRQ)

相关文章:
arm linux下的中断处理过程。
本文基于ast2600 soc来阐述,内核版本为5.10 1.中断gic初始化 start_kernel() -> init_IRQ() -> irqchip_init() of_irq_init()主要是构建of_intc_desc. 489-514: 从__irqchip_of_table中找到dts node中匹配的of_table(匹配matches->compatible)…...
C语言:指针详解
C语言:指针详解 1:指针的基本概念1:什么是指针2:为什么要引入指针3:指针的作用4:指针的类型 2:指针的声明与初始化1: 指针的声明2: 指针的初始化 3:指针的操作…...
github用户名密码登陆失效了
问题: git push突然推代码需要登陆,但是用户名和密码正确输入后,却提示403 git push# Username for https://github.com: **** #Password for https://gyp-programmergithub.com: #remote: Permission to gyp-programmer/my-app.git denie…...
【删除tomcat默认管理控制台】
停止Tomcat: ./catalina.sh stop 删除管理控制台应用: 进入Tomcat的webapps目录: cd /path/to/tomcat/webapps List item 删除manager和host-manager文件夹: rm -rf manager host-manager 启动Tomcat: ./catali…...
动态库与静态库:深入解析与应用
在软件开发中,库(Library)是预编译的代码集合,用于在多个程序之间共享功能。根据链接方式的不同,库主要分为两种类型:静态库(Static Library) 和 动态库(Dynamic Library…...
【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。
文章目录 Scaramuzza相机模型标定效果2、原理和代码代码1、 2D映射到3D,函数输入为2D点坐标OCAM参数代码功能详解2、3D --> 2D 3、总结Scaramuzza 模型的核心思想Scaramuzza 模型的核心思想与 Kannala-Brandt 模型的对比Scaramuzza 模型的独特之处Scaramuzza 的意…...
LVS 负载均衡集群(NAT模式)
一、环境准备 四台主机(一台 LVS、两台 RS、一台客户端) 注意每个虚拟机都需要关闭防火墙和 selinux 1.1.LVS 主机 LVS 主机(两块网卡) 第一块:NAT模式(内网) 第二块:添加网卡&am…...
MATLAB中的APPdesigner绘制多图问题解析?与逻辑值转成十进制
在matlab APPdesigner中绘图可以用UIAxes组件进行绘图,但是当想多张图时,只能提前绘制图像区域不方便。下面是几种办法: 为了操作可以添加Panl组件,方便操作。 1、当是要求的几个图像大小都是相同时刻采用函数: til…...
9种慢慢被淘汰的编程语言...
技术不断进步,我们使用的编程语言也不例外。 随着人工智能的兴起以及对编程语言使用的影响,我们更加关注哪些语言将在未来继续流行,哪些会被淘汰。 Python、Java 和 JavaScript 等多功能编程语言正在主导市场,而其他一些语言则逐…...
vue知识点5
1.如何让组件里的样式与其他组件互相不干扰 scope范围的意思 <style scope> </style> 2.vue的生命周期 创建 挂载 更新 销毁 3.vue的四个生命周期详解 创建beforeCreate,created 挂载 beforeMount,mounted 更新 beforeUpdate,updated 销毁 beforeDest…...
rdiff-backup备份
目录 1. 服务器备份知识点 1.1 备份策略 1.2 备份步骤和宝塔面板简介 1.3 CentOS7重要目录 2. 备份工具 2.1 tar -g 备份演示 2. rsync 备份演示 3. rdiff-backup 备份演示 4. 差异和优缺点 3. rdiff-backup安装和使用 3.1 备份命令rdiff-backup 3.2 恢复命令--…...
UE_C++ —— Metadata Specifiers
声明UClasses、UFunctions、UProperties、UEnums和UInterfaces时使用的元数据关键词,表示其与引擎和关卡编辑器诸多方面的互动方式; 当声明classe、interfaces、structs、enums、enum values、functions、or propertie时,可添加 Metadata Spe…...
【算法与数据结构】并查集详解
目录 一,什么是并查集 二,并查集的结构 三,并查集的代码实现 1,并查集的大致结构和初始化 2,find操作 3,Union操作 4,优化 小结: 四,并查集的应用场景 省份…...
deepseek多列数据对比,联想到excel的高级筛选功能
目录 1 业务背景 2 deepseek提示词输入 3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题,系统导入的数据和线下的EXCEL数据是否一致,如果不一致,如何快速找到差异值,原来脑海第一反应就是使用公…...
Windows操作系统部署Tomcat详细讲解
Tomcat是一个开源的Java Servlet容器,用于处理Java Web应用程序的请求和响应。以下是关于Tomcat的用法大全: 一、安装Tomcat 下载 访问Apache Tomcat官方网站(https://tomcat.apache.org/),根据你的操作系统…...
每日Attention学习23——KAN-Block
模块出处 [SPL 25] [link] [code] KAN See In the Dark 模块名称 Kolmogorov-Arnold Network Block (KAN-Block) 模块作用 用于vision的KAN结构 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as F import mathclass Swish(nn.Module)…...
今日写题04work
题目:移除链表元素 两种实现思路 思路一 使用双指针,prev,cur快慢指针解决。当cur不等于val,两个指针跳过。当等于val时,要考虑两种情况,一种是pos删,一种是头删除。 pos删除就是正常情况&am…...
Managed Lustre 和 WEKA:高性能文件系统的对比与应用
Managed Lustre 和 WEKA:高性能文件系统的对比与应用 1. 什么是 Managed Lustre?主要特点:适用场景: 2. 什么是 WEKA?主要特点:适用场景: 3. Managed Lustre 和 WEKA 的对比4. 如何选择 Managed…...
LeetCode541 反转字符串2
一、题目描述 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。具体规则如下: 如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等…...
MAC 系统关闭屏幕/睡眠 后被唤醒 Wake Requests
问题;查看wake 日志 pmset -g log | grep "Wake Requests" 为 Wake Requests [*processdasd requestSleepService...info"com.apple.alarm.user-invisible-com.apple.calaccessd...电源设置命令参考: pmset -g sched //查看定时…...
大模型MLOps流水线重构全图解(奇点大会首发架构图):从训练到上线压缩至72小时
更多请点击: https://intelliparadigm.com 第一章:大模型时代工程实践:奇点智能大会核心议题 在2024年奇点智能大会上,大模型工程化落地成为贯穿全场的技术主线。与会专家一致指出:模型能力已不再是瓶颈,而…...
Taotoken 的审计日志功能如何助力企业满足合规与安全审查
Taotoken 的审计日志功能如何助力企业满足合规与安全审查 在将大模型能力集成到企业业务流程时,除了关注模型效果与调用成本,对操作行为的可追溯性与数据安全的可控性同样是技术决策的关键考量。API Key 的滥用、异常调用的溯源、团队内部成本核算的模糊…...
Mac NTFS写入终极指南:如何免费解锁Windows硬盘的完整读写权限
Mac NTFS写入终极指南:如何免费解锁Windows硬盘的完整读写权限 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and manag…...
利用PowerDC Powertree功能,5分钟搞定多路电源系统的仿真设置
5分钟高效配置:PowerDC Powertree在多路电源系统仿真中的实战技巧 当一块主板同时承载着CPU核心供电、内存电压调节和高速IO电源网络时,传统仿真设置往往需要工程师逐一手动配置每个VRM模块和负载点——这个过程可能消耗数小时。而PowerDC的Powertree功能…...
用PDA5927四象限光电管DIY一个激光位置探测器(附Python数据采集代码)
用PDA5927四象限光电管DIY激光位置追踪系统(附Python实时可视化方案) 激光笔在幕布上的光斑位置检测、机器人视觉定位、甚至简易的光学动作捕捉——这些看似高深的应用,其实用一个四象限光电管就能实现核心功能。PDA5927这颗不足指甲盖大小的…...
从‘听不清’到‘看得明’:采样率Fs和点数N如何塑造你的数字世界(以音频信号为例)
从‘听不清’到‘看得明’:采样率Fs和点数N如何塑造你的数字世界(以音频信号为例) 当你用手机录制一段语音备忘录,或是用专业设备捕捉一场音乐会时,背后隐藏着两个关键参数在默默定义着声音的"清晰度"——采…...
一文搞懂什么是 Vibe Coding?
最近刷论坛、逛社区,发现一个很潮、很酷的新词儿:“Vibe Coding”。 乍一听有点懵,到底啥是“Vibe Coding”? 是写代码还要讲究氛围感吗?今天我就以一个码农的视角,聊聊我理解下的“Vibe Coding”ÿ…...
从玩具舵机到视觉追踪:聊聊OpenMV色块识别背后的图像处理与坐标转换
从玩具舵机到视觉追踪:OpenMV色块识别背后的图像处理与坐标转换 在嵌入式视觉系统中,色块追踪是一个看似简单却蕴含丰富技术细节的经典问题。当我们将OpenMV摄像头对准一个彩色物体时,屏幕上实时跳动的矩形框背后,是一系列精密的图…...
第十九篇:《视觉回归测试:让UI自动化检测样式异常》
传统的UI自动化测试主要验证功能正确性(元素是否存在、能否点击),但无法发现样式问题:字体变大了、颜色错了、布局错位、元素重叠等。视觉回归测试通过截图对比,能够精准捕获这些视觉上的“回归”。本文将介绍视觉回归…...
ARM1136JF-S处理器测试信号与功能变更解析
1. ARM1136JF-S处理器测试信号深度解析在嵌入式系统开发领域,处理器测试信号的理解和运用是硬件验证和调试的基础。ARM1136JF-S作为经典的ARM11系列处理器,其测试接口设计体现了ARM架构对可测试性的重视。让我们深入剖析这些关键信号及其应用场景。1.1 扫…...
