linux中断调用流程(arm)

news2025/4/21 17:37:10

文章目录

      • 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收到中断信号后,硬件自动完成以下操作:

  • 保存上下文:将当前程序状态(PSTATEPCSP等)压入内核栈。
    📦 关键寄存器:包括通用寄存器、程序计数器、栈指针。
  • 切换异常级别
    • 用户态(EL0)→ 内核态(EL1):触发完整的上下文切换。
      🔒 安全隔离:防止用户程序直接访问内核资源。
    • 内核态(EL1)→ EL1:仅保存关键寄存器,复用当前内核栈。
      快速路径:减少模式切换开销。
2. 跳转至中断向量表 🗺️
  • 向量表基址:由寄存器VBAR_EL1指定,指向内核预定义的向量表(arch/arm64/kernel/entry.S)。
    🏷️ 配置时机:内核启动时通过set_vbar()初始化。
  • 入口偏移计算
    • IRQ入口VBAR_EL1 + 0x280(EL1h模式)。
      🔍 偏移规则:每种异常类型有固定偏移量。
    • 同步异常入口VBAR_EL1 + 0x400(用于系统调用)。
      📌 示例:系统调用通过svc指令触发同步异常。
// 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);       // 初始化Distributor
    gic_cpu_init(gic);        // 初始化CPU Interface
    set_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的核心作用
    1. 中断上下文标记irq_enter()进入原子上下文,禁用调度。
      🚫 禁止行为:禁止睡眠、内存分配等非原子操作。
    2. 硬件中断号映射:通过irq_domain将硬件IRQ转换为Linux虚拟IRQ。
      🗂️ 映射策略:支持线性映射、树映射等多种方式。
    3. 调用设备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或网络协议栈处理。
3. 释放中断资源 🗑️

驱动卸载时需调用free_irq释放中断号:

void free_irq(unsigned int irq, void *dev_id);

⚠️ 内存安全:必须在驱动卸载路径中调用,防止资源泄漏。


五、示例:网卡中断处理全流程 🌐
  1. 硬件触发:网卡接收数据包,向GIC发送IRQ信号。
    📡 触发时机:DMA传输完成或FIFO缓冲区非空。
  2. GIC路由:Distributor将中断路由至CPU0,分配硬件中断号168。
    🔄 负载均衡:GICv3支持动态调整目标CPU。
  3. CPU跳转:CPU0执行向量表VBAR_EL1 + 0x280处的irq入口。
    ⏱️ 低延迟:硬件自动跳转,无需软件轮询。
  4. GIC处理gic_handle_irq读取中断号168,调用handle_domain_irq
    🔍 中断号解析:通过GICC_IAR寄存器获取。
  5. 中断映射:通过irq_domain将168映射为Linux虚拟IRQ 200。
    🌉 映射关系:存储在irq_desc[200].irq_data.hwirq
  6. 驱动处理:执行irq_desc[200].action中的网卡ISR(如NAPI收包)。
    🚀 性能优化:NAPI在收包时切换为轮询模式,减少中断风暴。
  7. 中断返回:恢复上下文,触发软中断(如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()

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2308504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

250301-OpenWebUI配置DeepSeek-火山方舟+硅基流动+联网搜索+推理显示

A. 最终效果 B. 火山方舟配置&#xff08;一定要点击添加&#xff09; C. 硅基流动配置&#xff08;最好要点击添加&#xff0c;否则会自动弹出所有模型&#xff09; D. 联网搜索配置 E. 推理过程显示 默认是没有下面的推理过程的显示的 设置步骤&#xff1a; 在Functions函…

【算法】图论 —— Floyd算法 python

洛谷 B3647 【模板】Floyd 题目描述 给出一张由 n n n 个点 m m m 条边组成的无向图。 求出所有点对 ( i , j ) (i,j) (i,j) 之间的最短路径。 输入格式 第一行为两个整数 n , m n,m n,m&#xff0c;分别代表点的个数和边的条数。 接下来 m m m 行&#xff0c;每行三…

Windows 11【1001问】查看Windows 11 版本的18种方法

随着技术的飞速发展&#xff0c;操作系统作为连接硬件与软件的核心桥梁&#xff0c;其版本管理和更新变得尤为重要。对于用户而言&#xff0c;了解自己设备上运行的具体Windows 11版本不仅有助于优化系统性能&#xff0c;还能确保安全性和兼容性。然而&#xff0c;不同场景和需…

(视频教程)Compass代谢分析详细流程及python版-R语言版下游分析和可视化

不想做太多的前情解说了&#xff0c;有点累了&#xff0c;做了很久的内容&#xff0c;包括整个分析&#xff0c;从软件安装和报错解决到后期下游python版-R语言版下游分析和可视化&#xff01;单细胞代谢分析我们写过很多了&#xff0c;唯独少了最“高级”的compass&#xff0c…

文件描述符与重定向

1. open系统调用 在 Linux 中, open() 系统调用用于打开一个文件或设备&#xff0c;并返回一个文件描述符&#xff0c;通过该描述符可以进行文件读写操作。open() 可以用于创建新文件或打开已存在的文件&#xff0c;具体行为取决于传递给它的参数。 需要包含的头文件&#xf…

基于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 系统开…

场内、场外期权怎么开户?期权佣金是多少?

期权交易需要一定的知识和经验&#xff0c;以有效管理风险和制定策略。 场内期权开户&#xff08;以50ETF为例&#xff09; 场内期权开户的各种方式大差不差&#xff0c;咱们就先以50ETF期权为例子看下。 场内期权开户条件包括&#xff1a; 首先是资金的要求&#xff0c;50万…

Linux:进程概念

目录 1 冯诺依曼体系 2 操作系统(Operator System) 3 如何理解管理 3.1计算机管理硬件 3.2 管理逻辑图 3.3 怎样管理 4 什么是进程&#xff1f; 5 查看进程 5.1 ps ajx显示所有进程信息 5.2 /proc(内存文件系统) 5.2.1 ls /proc/PID 5.2.2 ls /proc/PID -al ​ 5…

Rabbit MQ 高频面试题【刷题系列】

文章目录 一、公司生产环境用的什么消息中间件&#xff1f;二、Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点&#xff1f;三、解耦、异步、削峰是什么&#xff1f;四、消息队列有什么缺点&#xff1f;五、RabbitMQ一般用在什么场景&#xff1f;六、简单说RabbitMQ有哪些角…

【NLP 28、一文速通NLP文本分类任务 —— 深度学习】

目录 一、深度学习 — pipeline 流水线 1.配置文件 config.py Ⅰ、路径相关 Ⅱ、模型相关 Ⅲ、训练相关 2.数据加载 loader.py Ⅰ、类初始化 Ⅱ、加载数据并预处理 Ⅲ、文本编码 Ⅳ、对输入序列截断或填充 Ⅴ、返回数据长度 Ⅵ、返回对应索引位置元素 Ⅶ、加载词表 Ⅷ、封装数据…

UnrealEngine UE5 可视化 从地球观察火星 金星 土星 运动轨迹

视频参考&#xff1a;https://www.bilibili.com/video/BV1KpXSYdEdo/ 从地球观察土星的运动轨迹 从地球观察火星 轨迹 从地球观察金星的运动轨迹

Rocky Linux 8.5 6G内存 静默模式(没图形界面)安装Oracle 19C

Oracle19c 下载地址 Database Software Downloads | Oraclehttps://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee 目录 一、准备服务器 1、服务器可以克隆、自己装 2、修改主机名 3、重启 4、关闭selinux 5、关闭防火墙 5.1、…

免费轻巧多功能 PDF 处理工具:转换、压缩、提取一应俱全

软件技术 今天要给大家分享一款超实用的 PDF 处理工具&#xff0c;它免费又轻巧&#xff0c;如同随时待命的得力小帮手&#xff0c;功能之强大超乎想象&#xff0c;真的值得大家收藏。 这款工具是绿色版软件&#xff0c;解压后开启&#xff0c;满满的 PDF 处理功能便映入眼帘…

基于ssm的校园跑腿管理系统+vue

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统共有管理员、用户两个角色 管理员主要的功能用户信息管理、任务信息管理、任务类型管理、接单信息管理、公告信息管理、投诉信息管理、公告类型管…

java数据结构_Map和Set_9.1

1. 搜索树 1.1 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有的结点都小于根结点的值若它的右子树不为空&#xff0c;则右子树上所有的结点都大于根结点的值…

横向移动靶场-Tr0ll: 3

Tr0ll: 3来自 <Tr0ll: 3 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.187 3&#xff0c;对靶机进行端口服务探测 …

记20忘10之六:line

记20忘10之六&#xff1a;line 胖子定律&#xff1a;每天坚持多咬两口&#xff0c;相信将来自己就是个胖子 今天&#xff0c;我们继续来记几个单词吧&#xff0c; line n.线 moral bottom line道德底线 派生、同源或相关&#xff1a; linear a.线的&#xff0c;直线的lineamen…

【愚公系列】《Python网络爬虫从入门到精通》036-DataFrame日期数据处理

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

使用ChatGPT-Deep Reaserch两步给出文献综述!

文献综述是学术论文写作中不可或缺的一部分&#xff0c;它不仅是对已有研究的梳理和总结&#xff0c;更是为后续研究奠定理论基础的关键步骤。通过文献综述研究者能够全面了解当前研究领域的现状、主要观点和研究方法&#xff0c;从而找到自己研究的切入点和创新点。这一过程需…

从0开始的操作系统手搓教程14——进一步完成中断子系统

目录 所以&#xff0c;如何查看我们的IDT呢 改进我们的中断处理hook 对8253编程&#xff0c;提升系统的频率 导论 控制字说明 说一下每个方式——概论 说一说计数器如何进行计时 方式0 方式1 方式2 方式3 方式4 方式5 回到问题&#xff0c;我们如何设置单次触发冲…