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 //查看定时…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
