当前位置: 首页 > news >正文

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来阐述&#xff0c;内核版本为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)&#xf…...

C语言:指针详解

C语言&#xff1a;指针详解 1&#xff1a;指针的基本概念1&#xff1a;什么是指针2&#xff1a;为什么要引入指针3&#xff1a;指针的作用4&#xff1a;指针的类型 2&#xff1a;指针的声明与初始化1&#xff1a; 指针的声明2&#xff1a; 指针的初始化 3&#xff1a;指针的操作…...

github用户名密码登陆失效了

问题&#xff1a; git push突然推代码需要登陆&#xff0c;但是用户名和密码正确输入后&#xff0c;却提示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&#xff1a; ./catalina.sh stop 删除管理控制台应用&#xff1a; 进入Tomcat的webapps目录&#xff1a; cd /path/to/tomcat/webapps List item 删除manager和host-manager文件夹&#xff1a; rm -rf manager host-manager 启动Tomcat&#xff1a; ./catali…...

动态库与静态库:深入解析与应用

在软件开发中&#xff0c;库&#xff08;Library&#xff09;是预编译的代码集合&#xff0c;用于在多个程序之间共享功能。根据链接方式的不同&#xff0c;库主要分为两种类型&#xff1a;静态库&#xff08;Static Library&#xff09; 和 动态库&#xff08;Dynamic Library…...

【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。

文章目录 Scaramuzza相机模型标定效果2、原理和代码代码1、 2D映射到3D&#xff0c;函数输入为2D点坐标OCAM参数代码功能详解2、3D --> 2D 3、总结Scaramuzza 模型的核心思想Scaramuzza 模型的核心思想与 Kannala-Brandt 模型的对比Scaramuzza 模型的独特之处Scaramuzza 的意…...

LVS 负载均衡集群(NAT模式)

一、环境准备 四台主机&#xff08;一台 LVS、两台 RS、一台客户端&#xff09; 注意每个虚拟机都需要关闭防火墙和 selinux 1.1.LVS 主机 LVS 主机&#xff08;两块网卡&#xff09; 第一块&#xff1a;NAT模式&#xff08;内网&#xff09; 第二块&#xff1a;添加网卡&am…...

MATLAB中的APPdesigner绘制多图问题解析?与逻辑值转成十进制

在matlab APPdesigner中绘图可以用UIAxes组件进行绘图&#xff0c;但是当想多张图时&#xff0c;只能提前绘制图像区域不方便。下面是几种办法&#xff1a; 为了操作可以添加Panl组件&#xff0c;方便操作。 1、当是要求的几个图像大小都是相同时刻采用函数&#xff1a; til…...

9种慢慢被淘汰的编程语言...

技术不断进步&#xff0c;我们使用的编程语言也不例外。 随着人工智能的兴起以及对编程语言使用的影响&#xff0c;我们更加关注哪些语言将在未来继续流行&#xff0c;哪些会被淘汰。 Python、Java 和 JavaScript 等多功能编程语言正在主导市场&#xff0c;而其他一些语言则逐…...

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时使用的元数据关键词&#xff0c;表示其与引擎和关卡编辑器诸多方面的互动方式&#xff1b; 当声明classe、interfaces、structs、enums、enum values、functions、or propertie时&#xff0c;可添加 Metadata Spe…...

【算法与数据结构】并查集详解

目录 一&#xff0c;什么是并查集 二&#xff0c;并查集的结构 三&#xff0c;并查集的代码实现 1&#xff0c;并查集的大致结构和初始化 2&#xff0c;find操作 3&#xff0c;Union操作 4&#xff0c;优化 小结&#xff1a; 四&#xff0c;并查集的应用场景 省份…...

deepseek多列数据对比,联想到excel的高级筛选功能

目录 1 业务背景 ​2 deepseek提示词输入 ​3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题&#xff0c;系统导入的数据和线下的EXCEL数据是否一致&#xff0c;如果不一致&#xff0c;如何快速找到差异值&#xff0c;原来脑海第一反应就是使用公…...

Windows操作系统部署Tomcat详细讲解

Tomcat是一个开源的Java Servlet容器&#xff0c;用于处理Java Web应用程序的请求和响应。以下是关于Tomcat的用法大全&#xff1a; 一、安装Tomcat 下载 访问Apache Tomcat官方网站&#xff08;https://tomcat.apache.org/&#xff09;&#xff0c;根据你的操作系统&#xf…...

每日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

题目&#xff1a;移除链表元素 两种实现思路 思路一 使用双指针&#xff0c;prev&#xff0c;cur快慢指针解决。当cur不等于val&#xff0c;两个指针跳过。当等于val时&#xff0c;要考虑两种情况&#xff0c;一种是pos删&#xff0c;一种是头删除。 pos删除就是正常情况&am…...

Managed Lustre 和 WEKA:高性能文件系统的对比与应用

Managed Lustre 和 WEKA&#xff1a;高性能文件系统的对比与应用 1. 什么是 Managed Lustre&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 2. 什么是 WEKA&#xff1f;主要特点&#xff1a;适用场景&#xff1a; 3. Managed Lustre 和 WEKA 的对比4. 如何选择 Managed…...

LeetCode541 反转字符串2

一、题目描述 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。具体规则如下&#xff1a; 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等…...

MAC 系统关闭屏幕/睡眠 后被唤醒 Wake Requests

问题&#xff1b;查看wake 日志 pmset -g log | grep "Wake Requests" 为 Wake Requests [*processdasd requestSleepService...info"com.apple.alarm.user-invisible-com.apple.calaccessd...电源设置命令参考&#xff1a; pmset -g sched //查看定时…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启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的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; 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&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...