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

Linux 中断系统全览解析:从硬件到软件的全路线理解

Linux 中断系统全览解析:从硬件到软件的全路线理解

Linux 中断是进程与硬件进行交互的核心机制之一,在计算机系统中拥有极高的优先级。本文将从硬件启动、设备树描述、内核处理、中断注册、上下文区分等方面全面解析 Linux 中断机制。


在这里插入图片描述

一、中断硬件原理

中断硬件通常持有以下元素:

  • 中断源:如 GPIO、UART、I2C、Timer 等设备
  • 中断控制器:包括 GIC、APIC、PLIC 等
  • 向 CPU 通知:硬件产生中断后给予 CPU 一个 IRQ编号

硬件中断可能是线程型触发(上升、下降边缘)或者电平型触发(高、低电平),通过中断控制器编码后通知给 Linux 内核。


二、设备树中断描述

中断的硬件触发方式和配置在设备树中通过 interruptsinterrupt-parent 字段表示:

interrupt-parent = <&gpio1>;
interrupts = <14 IRQ_TYPE_EDGE_FALLING>; // GPIO1_14 下降边缘

基于这个配置,内核会通过 of_irq API 解析成实际中断编号,且与该设备对应。


三、Linux 内核中断处理系统结构

主要数据结构

结构作用
struct irq_desc每个中断编号对应一个 descriptor
struct irq_chip控制器相关操作 (mask/unmask/ack)
struct irqaction中断 handler 绑定信息

主要函数路径

request_threaded_irq()   // 注册中断-> __setup_irq()    // 创建 irq_desc, irqaction 等-> irq_startup() // 启用硬件 irq

中断触发时,内核进入:

do_IRQ()generic_handle_irq()handle_irq_event()→ handler function (driver 注册的)

四、中断处理方式

Linux 支持两种处理模式:

方式 1:传统 top-half + bottom-half

  • Top-half:即被触发中断时首先执行的函数,运行在硬中断上下文,负责简单、快速操作,如释放 spinlock、记录事件、传递数据等。
  • Bottom-half:将耗时操作延后,通常通过 softirq、tasklet、workqueue 来实现,允许睡眠、延时执行,可以在进程或内核线程中运行。

方式 2:线程化中断 (Threaded IRQ)

devm_request_threaded_irq(irq, NULL, thread_fn, IRQF_ONESHOT, ...);
  • 不使用 top-half,直接通过内核线程执行 thread_fn
  • 允许睡眠,适合 I2C 等慢速应答设备
  • 常配合 IRQF_ONESHOT,确保当前线程未处理完成前,不会再次触发中断

五、中断下半段的分类与处理

1. 软中断 (SoftIRQ)

  • 最低层、最高优先级的下半段机制
  • 在硬中断运行完后、还未返回时执行
  • 通常依赖在能够进入内核的进程上,例如 ksoftirqd
  • 其中最常用的是 NET_RX_SOFTIRQTIMER_SOFTIRQBLOCK_SOFTIRQ

2. tasklet

  • 基于 softirq 实现,但是较高级。
  • 同一个 tasklet 无法并行,自带不可重入性
  • API 如:tasklet_schedule()tasklet_disable()

3. workqueue

  • 最适合长时间操作的下半段
  • 允许睡眠,在内核线程中执行
  • 可选择使用全局 workqueue ,或者自定义 workqueue

下半段选择指南

场景选择
需要最小延迟softirq
需要不可并行tasklet
需要睡眠/长时间workqueue
I2C/微线接口workqueue / threaded IRQ

六、中断常用接口 API

注册/取消

int request_irq(unsigned int irq, irq_handler_t handler, ...);
int devm_request_threaded_irq(...);
void free_irq(unsigned int irq, void *dev_id);

操控

void enable_irq(unsigned int irq);
void disable_irq(unsigned int irq);
void irq_set_irq_type(unsigned int irq, unsigned int type);

七、中断标志使用

标志含义
IRQF_TRIGGER_RISING上升边缘触发
IRQF_TRIGGER_FALLING下降边缘触发
IRQF_ONESHOT线程化中断时要求处理完成前不再次触发
IRQF_SHARED允许多设备共享同一中断口
IRQF_NO_AUTOEN注册后不自动 enable,需手动 enable_irq

八、总结

Linux 中断系统是硬件和内核互动的基石,通过标准化的接口、动态分配、密切的上下文处理,极大程度地实现了弹性、可靠、可扩展。同时,中断的各级处理机制(top-half, softirq, tasklet, workqueue, threaded irq)结构了一套高效、安全、应对应用场景的处理模型。

http://www.lryc.cn/news/613107.html

相关文章:

  • 外部排序总结(考研向)
  • MongoDB数据存储界的瑞士军刀:cpolar内网穿透实验室第513号挑战
  • 数据结构:双向链表(Doubly Linked List)
  • 生成对抗网络(GAN)实战 - 创建逼真人脸图像
  • 电路相量法
  • (易视宝)易视TV is-E4-G-全志A20芯片-安卓4-烧写卡刷工具及教程
  • C++的“模板”
  • day069-Jenkins基础使用与参数化构建
  • golang的面向对象编程,struct的使用
  • 急危重症专科智能体”构建新一代急诊、手术与重症中心的AI医疗方向探析
  • 【深度学习机器学习】构建情绪对话模型:从数据到部署的完整实践
  • 小鸡模拟器安卓版:经典街机游戏的移动体验
  • Elcomsoft Wireless Security Auditor 安装教程-安全检测工具使用指南
  • 数据结构----栈和队列认识
  • 深度学习-卷积神经网络CNN-1×1卷积层
  • 仓库管理系统-21-前端之入库和出库管理
  • Windows中安装rustup-init.exe以及cargo build报错443
  • 零基础-动手学深度学习-9.3. 深度循环神经网络
  • 流程图使用规范
  • Android 之 面试八股文
  • GCC与NLP实战:编译技术赋能自然语言处理
  • 解决GitHub无法打开
  • idea开发工具中git如何忽略编译文件build、gradle的文件?
  • 复杂井眼测量中,陀螺定向和磁通门定向哪个更胜一筹?
  • 幕后英雄 —— Background Scripts (Service Worker)
  • 浅析 Berachain v2 ,对原有 PoL 机制进行了哪些升级?
  • 我的世界Java版1.21.4的Fabric模组开发教程(十七)自定义维度
  • 比较一下XGBoost与LSTM、GRU、Transformer数据格式方面的核心区别
  • 零基础-动手学深度学习-9.1. 门控循环单元(GRU)及代码实现
  • Docker国内可用镜像列表(长期免费)