linux中断调用流程(arm)
文章目录
- ARM架构下Linux中断处理全流程解析:从硬件触发到驱动调用 ⚡
- **一、中断触发与硬件层响应** 🔌
- **1. 设备触发中断** 📡
- **二、CPU阶段:异常入口与上下文处理** 🖥️
- **1. 异常模式切换** 🔄
- **2. 跳转至中断向量表** 🗺️
- **三、内核中断处理框架** ⚙️
- **1. 中断向量表初始化** 📜
- **2. 中断控制器驱动注册** 🔧
- **3. 中断分发与设备处理** 🔀
- **四、设备驱动中的中断处理流程** 🛠️
- **1. 驱动注册中断处理函数** 📝
- **2. 实现中断处理函数** 🛠️
- **3. 释放中断资源** 🗑️
- **五、示例:网卡中断处理全流程** 🌐
- **六、关键数据结构与机制** 📊
ARM架构下Linux中断处理全流程解析:从硬件触发到驱动调用 ⚡

一、中断触发与硬件层响应 🔌
1. 设备触发中断 📡
当外设(如网卡、键盘)需要CPU处理时,其硬件控制器会通过物理中断线(IRQ)向中断控制器发送信号。以ARM的通用中断控制器(GICv3)为例:
- 中断接收:GIC Distributor模块接收中断请求,并根据中断类型(SPI/PPI/SGI)分类。
🛠️ 关键点:SPI用于共享外设中断,PPI为CPU私有中断。 - 优先级仲裁:Distributor根据中断优先级(配置于寄存器
GICD_IPRIORITYRn)和屏蔽状态,选择最高优先级中断。
⚖️ 优先级规则:数值越小优先级越高,0为最高。 - 路由到目标CPU:通过Redistributor模块将中断传递给目标CPU核心(支持多核负载均衡)。
🌐 多核优化:避免单核过载,提升系统吞吐量。 - 物理信号触发:GIC通过CPU的IRQ引脚触发异常模式切换。
⚡ 信号传递:硬件自动完成,无需软件干预。
二、CPU阶段:异常入口与上下文处理 🖥️
1. 异常模式切换 🔄
CPU收到中断信号后,硬件自动完成以下操作:
- 保存上下文:将当前程序状态(
PSTATE、PC、SP等)压入内核栈。
📦 关键寄存器:包括通用寄存器、程序计数器、栈指针。 - 切换异常级别:
- 用户态(EL0)→ 内核态(EL1):触发完整的上下文切换。
🔒 安全隔离:防止用户程序直接访问内核资源。 - 内核态(EL1)→ EL1:仅保存关键寄存器,复用当前内核栈。
⏩ 快速路径:减少模式切换开销。
- 用户态(EL0)→ 内核态(EL1):触发完整的上下文切换。
2. 跳转至中断向量表 🗺️
- 向量表基址:由寄存器
VBAR_EL1指定,指向内核预定义的向量表(arch/arm64/kernel/entry.S)。
🏷️ 配置时机:内核启动时通过set_vbar()初始化。 - 入口偏移计算:
- IRQ入口:
VBAR_EL1 + 0x280(EL1h模式)。
🔍 偏移规则:每种异常类型有固定偏移量。 - 同步异常入口:
VBAR_EL1 + 0x400(用于系统调用)。
📌 示例:系统调用通过svc指令触发同步异常。
- IRQ入口:
// arch/arm64/kernel/entry.S
kernel_ventry 1, irq // EL1h模式IRQ入口

三、内核中断处理框架 ⚙️
1. 中断向量表初始化 📜
ARM64的中断向量表通过汇编宏kernel_ventry定义,每个条目对应一种异常类型:
- IRQ处理入口:最终调用
handle_arch_irq(全局函数指针)。
🔗 跳转逻辑:从汇编跳转到C语言函数。 - 关键汇编跳转:
irq_handler:bl handle_arch_irq // 跳转到C语言处理函数
2. 中断控制器驱动注册 🔧
以GIC驱动为例,初始化时完成中断处理函数的绑定:
// drivers/irqchip/irq-gic.c
void __init gic_init(...) {gic_dist_init(gic); // 初始化Distributorgic_cpu_init(gic); // 初始化CPU Interfaceset_handle_irq(gic_handle_irq); // 注册全局处理函数
}

set_handle_irq:将gic_handle_irq赋值给handle_arch_irq,建立汇编到C的桥梁。
🌉 桥梁作用:屏蔽硬件差异,统一中断入口。
3. 中断分发与设备处理 🔀
GIC驱动通过gic_handle_irq读取中断号并分发给设备驱动:
static void __exception_irq_entry gic_handle_irq(...) {u32 irqnr = gic_read_iar(); // 读取GIC中断应答寄存器handle_domain_irq(gic_data.domain, irqnr, regs); // 映射并处理
}

// kernel/irq/irqdesc.c
int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,bool lookup, struct pt_regs *regs) {...irq_enter(); // 进入中断上下文irq = irq_find_mapping(domain, hwirq); // 硬件中断号映射为虚拟中断号if (irq合法) {generic_handle_irq(irq); // 调用中断处理链} else {ack_bad_irq(irq); // 错误处理}irq_exit(); // 退出中断上下文...
}

handle_domain_irq的核心作用:- 中断上下文标记:
irq_enter()进入原子上下文,禁用调度。
🚫 禁止行为:禁止睡眠、内存分配等非原子操作。 - 硬件中断号映射:通过
irq_domain将硬件IRQ转换为Linux虚拟IRQ。
🗂️ 映射策略:支持线性映射、树映射等多种方式。 - 调用设备ISR:从
irq_desc[].action链表中执行驱动注册的中断处理函数。
⚡ 快速响应:上半部处理时间通常小于1ms。
- 中断上下文标记:
四、设备驱动中的中断处理流程 🛠️
1. 驱动注册中断处理函数 📝
设备驱动通过request_irq注册中断服务例程(ISR):
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);
- 参数说明:
irq:虚拟中断号(由irq_of_parse_and_map解析设备树获得)。
🌳 设备树示例:interrupts = <0 168 IRQ_TYPE_EDGE_RISING>; // SPI 168,上升沿触发flags:标志位(如IRQF_SHARED表示共享中断)。
⚠️ 共享中断:需唯一dev_id标识不同设备。dev:设备标识符(共享中断时用于区分设备)。
📌 示例:PCI设备使用pci_dev指针作为标识。
2. 实现中断处理函数 🛠️
-
上半部(Top Half):快速响应硬件,禁止阻塞或睡眠。
static irqreturn_t my_irq_handler(int irq, void *dev_id) {struct net_device *dev = dev_id;// 1. 读取硬件状态(如网卡DMA缓冲区)u32 status = readl(dev->reg_base + STATUS_REG);// 2. 清除中断标志writel(STATUS_CLEAR, dev->reg_base + STATUS_REG);// 3. 触发下半部(如tasklet)tasklet_schedule(&dev->tasklet);return IRQ_HANDLED; }🚨 注意事项:避免在中断上下文中调用
kmalloc()或mutex_lock()。 -
下半部(Bottom Half):处理耗时任务,支持多种机制:
- SoftIRQ:内核预定义的高优先级任务(如网络收包)。
🌟 优势:支持多CPU并行处理。 - Tasklet:基于SoftIRQ,单CPU串行执行。
⚡ 适用场景:GPIO按键去抖动处理。 - Workqueue:运行于进程上下文,允许休眠。
🛌 示例:文件I/O或网络协议栈处理。
- SoftIRQ:内核预定义的高优先级任务(如网络收包)。
3. 释放中断资源 🗑️
驱动卸载时需调用free_irq释放中断号:
void free_irq(unsigned int irq, void *dev_id);
⚠️ 内存安全:必须在驱动卸载路径中调用,防止资源泄漏。
五、示例:网卡中断处理全流程 🌐
- 硬件触发:网卡接收数据包,向GIC发送IRQ信号。
📡 触发时机:DMA传输完成或FIFO缓冲区非空。 - GIC路由:Distributor将中断路由至CPU0,分配硬件中断号168。
🔄 负载均衡:GICv3支持动态调整目标CPU。 - CPU跳转:CPU0执行向量表
VBAR_EL1 + 0x280处的irq入口。
⏱️ 低延迟:硬件自动跳转,无需软件轮询。 - GIC处理:
gic_handle_irq读取中断号168,调用handle_domain_irq。
🔍 中断号解析:通过GICC_IAR寄存器获取。 - 中断映射:通过
irq_domain将168映射为Linux虚拟IRQ 200。
🌉 映射关系:存储在irq_desc[200].irq_data.hwirq。 - 驱动处理:执行
irq_desc[200].action中的网卡ISR(如NAPI收包)。
🚀 性能优化:NAPI在收包时切换为轮询模式,减少中断风暴。 - 中断返回:恢复上下文,触发软中断(如
NET_RX_SOFTIRQ)处理数据。
📦 数据传递:sk_buff从内核空间传递到用户空间。
六、关键数据结构与机制 📊
| 组件/机制 | 功能说明 | 示例/API |
|---|---|---|
| GIC Distributor | 接收外设中断,优先级仲裁,路由到目标CPU核心。 | gic_dist_init() |
| VBAR_EL1 | 存储中断向量表基址,决定异常入口跳转位置。 | set_vbar() |
| irq_domain | 管理硬件中断号(HW IRQ)到Linux虚拟中断号(VIRQ)的映射。 | irq_domain_add_linear() |
| irq_desc[] | 全局中断描述符数组,存储中断处理函数链(action链表)。 | struct irq_desc |
| request_irq() | 驱动注册中断处理函数,关联到irq_desc[VIRQ].action链表。 | request_irq() |


相关文章:
linux中断调用流程(arm)
文章目录 ARM架构下Linux中断处理全流程解析:从硬件触发到驱动调用 ⚡**一、中断触发与硬件层响应** 🔌**1. 设备触发中断** 📡 **二、CPU阶段:异常入口与上下文处理** 🖥️**1. 异常模式切换** 🔄**2. 跳转…...
考研复试问题总结-数据结构(1)
1. 说一下你对数据结构的理解 我觉得数据结构不仅仅是存数据的“容器”,更是一种思维方式。其实,在我们写程序时,经常会遇到各种各样的数据操作需求,而不同的数据结构能解决问题的效率和方式都不一样,所以选择合适的数…...
250301-OpenWebUI配置DeepSeek-火山方舟+硅基流动+联网搜索+推理显示
A. 最终效果 B. 火山方舟配置(一定要点击添加) C. 硅基流动配置(最好要点击添加,否则会自动弹出所有模型) D. 联网搜索配置 E. 推理过程显示 默认是没有下面的推理过程的显示的 设置步骤: 在Functions函…...
RuoYi框架介绍,以及如何基于Python使用RuoYi框架
若依框架(RuoYi)是一款基于Spring Boot和Vue.js的开源快速开发平台,广泛应用于企业级应用开发。它提供了丰富的功能模块和代码生成工具,帮助开发者快速搭建后台管理系统。 主要特点 前后端分离:前端采用Vue.js&#x…...
【算法】图论 —— Floyd算法 python
洛谷 B3647 【模板】Floyd 题目描述 给出一张由 n n n 个点 m m m 条边组成的无向图。 求出所有点对 ( i , j ) (i,j) (i,j) 之间的最短路径。 输入格式 第一行为两个整数 n , m n,m n,m,分别代表点的个数和边的条数。 接下来 m m m 行,每行三…...
2.数据结构:2.最大异或对
数据结构 2.数据结构:1.Tire 字符串统计 当前题 最大异或对 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010,M31*N;// M 表示节点个数,每一个数最多有 31 位int n; int a[N]; i…...
剑指 Offer II 031. 最近最少使用缓存
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20031.%20%E6%9C%80%E8%BF%91%E6%9C%80%E5%B0%91%E4%BD%BF%E7%94%A8%E7%BC%93%E5%AD%98/README.md 剑指 Offer II 031. 最近最少使用缓存 题目描述 运用所掌握的…...
Windows 11【1001问】查看Windows 11 版本的18种方法
随着技术的飞速发展,操作系统作为连接硬件与软件的核心桥梁,其版本管理和更新变得尤为重要。对于用户而言,了解自己设备上运行的具体Windows 11版本不仅有助于优化系统性能,还能确保安全性和兼容性。然而,不同场景和需…...
小程序性能优化-预加载
在微信小程序中,数据预加载是提升用户体验的重要优化手段。以下是处理数据预加载的完整方案: 一、预加载的适用场景 跳转页面前的数据准备 如从列表页进入详情页前,提前加载详情数据首屏加载后的空闲时间 在首页加载完成后,预加载…...
vue3中展示markdown格式文章的三种形式
一、安装 # 使用 npm npm i kangc/v-md-editor -S# 使用yarn yarn add kangc/v-md-editor二、三种实现形式 1、编辑器的只读模式 main.ts文件中配置: import VMdEditor from kangc/v-md-editor; import kangc/v-md-editor/lib/style/base-editor.css;const app …...
(视频教程)Compass代谢分析详细流程及python版-R语言版下游分析和可视化
不想做太多的前情解说了,有点累了,做了很久的内容,包括整个分析,从软件安装和报错解决到后期下游python版-R语言版下游分析和可视化!单细胞代谢分析我们写过很多了,唯独少了最“高级”的compass,…...
文件描述符与重定向
1. open系统调用 在 Linux 中, open() 系统调用用于打开一个文件或设备,并返回一个文件描述符,通过该描述符可以进行文件读写操作。open() 可以用于创建新文件或打开已存在的文件,具体行为取决于传递给它的参数。 需要包含的头文件…...
为什么深度学习选择Tensor而非NumPy数组?核心优势深度解析
简短总结: 支持 GPU 加速:Tensor 提供对 GPU 的原生支持,能够有效加速计算,而 NumPy 则通常只能在 CPU 上运行。支持自动求导:深度学习模型的训练依赖于参数的优化,而 Tensor 提供了自动求导功能ÿ…...
python把html网页转换成pdf标题没有乱码,正文都乱码
在使用Python将HTML网页转换成PDF时,遇到标题没有乱码但正文乱码的问题,通常是由于字符编码处理不当或字体支持问题导致的。以下是一些可能的原因和解决方案: 原因分析 字符编码不匹配: HTML文件的编码与PDF转换工具或库所使用的…...
基于fast-whisper模型的语音识别工具的设计与实现
目录 摘 要 第1章 绪 论 1.1 论文研究主要内容 1.1.1模型类型选择 1.1.2开发语言的选择 1.2 国内外现状 第2章 关键技术介绍 2.1 关键性开发技术的介绍 2.1.1 Faster-Whisper数据模型 2.1.2 Django 第3章 系统分析 3.1 构架概述 3.1.1 功能构架 3.1.2 模块需求描述 3.2 系统开…...
详解:事务注解 @Transactional
创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家! Transactional 是 Spring Framework 中常用的注解之一,它可以被用于管理事务。通过使用…...
场内、场外期权怎么开户?期权佣金是多少?
期权交易需要一定的知识和经验,以有效管理风险和制定策略。 场内期权开户(以50ETF为例) 场内期权开户的各种方式大差不差,咱们就先以50ETF期权为例子看下。 场内期权开户条件包括: 首先是资金的要求,50万…...
Linux:进程概念
目录 1 冯诺依曼体系 2 操作系统(Operator System) 3 如何理解管理 3.1计算机管理硬件 3.2 管理逻辑图 3.3 怎样管理 4 什么是进程? 5 查看进程 5.1 ps ajx显示所有进程信息 5.2 /proc(内存文件系统) 5.2.1 ls /proc/PID 5.2.2 ls /proc/PID -al 5…...
Rabbit MQ 高频面试题【刷题系列】
文章目录 一、公司生产环境用的什么消息中间件?二、Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点?三、解耦、异步、削峰是什么?四、消息队列有什么缺点?五、RabbitMQ一般用在什么场景?六、简单说RabbitMQ有哪些角…...
破解密码防线:渗透测试中的密码攻击手法汇总
密码是网络安全中的一道重要防线,然而,若密码策略不严密,往往会为攻击者提供可乘之机。本文将简要介绍渗透测试中关于密码的几种常见攻击思路和手法。 1. 确认使用默认及常见的账号密码 在渗透测试的初期,攻击者通常会尝试使用系…...
大模型在白血病诊疗全流程风险预测与方案制定中的应用研究
目录 一、绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与内容 二、大模型技术与白血病相关知识 2.1 大模型技术原理与特点 2.2 白血病的病理生理与诊疗现状 三、术前风险预测与手术方案制定 3.1 术前数据收集与预处理 3.2 大模型预测术前风险 3.3 根据…...
5-2JVM内存的各种应用
一、堆区(Heap)——对象实例的存储池 实际应用场景: 对象实例化:所有通过 new 关键字创建的对象实例均存储在堆中。例如: java Person person new Person(“张三”); // person对象实例分配在堆区1,4,6 大对象直…...
【NLP 28、一文速通NLP文本分类任务 —— 深度学习】
目录 一、深度学习 — pipeline 流水线 1.配置文件 config.py Ⅰ、路径相关 Ⅱ、模型相关 Ⅲ、训练相关 2.数据加载 loader.py Ⅰ、类初始化 Ⅱ、加载数据并预处理 Ⅲ、文本编码 Ⅳ、对输入序列截断或填充 Ⅴ、返回数据长度 Ⅵ、返回对应索引位置元素 Ⅶ、加载词表 Ⅷ、封装数据…...
nvidia驱动更新,centos下安装openwebui+ollama(非docker)
查看centos内核版本 uname -a cat /etc/redhat-release下载对应的程序(这个是linux64位版本通用的) https://cn.download.nvidia.cn/tesla/550.144.03/NVIDIA-Linux-x86_64-550.144.03.run cudnn想办法自己下一下,我这里是12.x和11.x通用的…...
UnrealEngine UE5 可视化 从地球观察火星 金星 土星 运动轨迹
视频参考:https://www.bilibili.com/video/BV1KpXSYdEdo/ 从地球观察土星的运动轨迹 从地球观察火星 轨迹 从地球观察金星的运动轨迹...
蓝桥杯 五子棋对弈
五子棋对弈 问题描述 “在五子棋的对弈中,友谊的小船说翻就翻?” 不!对小蓝和小桥来说,五子棋不仅是棋盘上的较量,更是心与心之间的沟通。这两位挚友秉承着"友谊第一,比赛第二"的宗旨ÿ…...
springmvc热点面试题开胃菜
1. Spring MVC的核心组件有哪些?它们的作用是什么? 答案: Spring MVC的核心组件包括以下部分,每个组件都有其特定的作用: DispatcherServlet: 前端控制器,是Spring MVC的核心。它负责接收所有H…...
关于深度学习的一份介绍
在这篇文章中,我将介绍有关深度学习的东西,主要是它与神经网络的关系、目前主要的网络有哪些,以及加深神经网络的意义等。 一、联系 在之前的文章中,我曾介绍过神经网络,而所谓的神经网络其实就是深度学习的一种架构…...
JavaScript系列02-函数深入理解
本文介绍了JavaScript函数相关知识,包括 函数声明与函数表达式 - 解释两者的区别,提升行为,以及使用场景箭头函数特性 - 讲解语法、词法this、不能作为构造函数等特点this绑定机制 - 详细讲解四种绑定规则:默认绑定、隐式绑定、显…...
Netty是怎么实现Java NIO多路复用的?(源码)
目录 NIO多路复用实现事件循环是什么?核心源码(1)调用 NioEventLoopGroup 默认构造器(2)指定 SelectorProvider(3)创建 Selector(4)创建单线程和队列(5&#…...
