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 //查看定时…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
