news 2026/4/15 9:39:08

[Linux外设驱动详解]6. 中断处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[Linux外设驱动详解]6. 中断处理

6. 中断处理

概述

中断是硬件与操作系统内核通信的核心机制。当硬件设备需要 CPU 注意时,会通过中断信号线向 CPU 发送请求。Linux 内核采用分阶段处理策略来响应中断:

  • 上半部(Hard IRQ):在硬件中断上下文中执行,快速响应,禁止抢占
  • 下半部:在稍后执行,处理耗时操作,允许睡眠

中断请求

快速处理

触发下半部

硬件设备

CPU

上半部
Hard IRQ

中断控制器

下半部机制

软中断

Tasklet

工作队列


6.1 上半部 vs 下半部

6.1.1 为什么需要分阶段处理?

特性上半部下半部
执行上下文硬件中断上下文软中断/进程上下文
禁止抢占
允许睡眠部分允许(仅工作队列)
执行时间尽可能短可较长
响应速度最快稍慢

设计原则

  • 上半部只做必须立即完成的事情:读硬件寄存器、应答中断
  • 下半部处理耗时操作:数据处理、拷贝、与设备协议交互

6.1.2 软中断(Softirq)

软中断是下半部的基础机制,在内核编译时静态定义。软中断类型在 include/linux/interrupt.h:532-546 定义:

enum{HI_SOFTIRQ=0,// 高优先级软中断TIMER_SOFTIRQ,// 定时器软中断NET_TX_SOFTIRQ,// 网络发送软中断NET_RX_SOFTIRQ,// 网络接收软中断BLOCK_SOFTIRQ,// 块设备软中断IRQ_POLL_SOFTIRQ,// IRQ轮询软中断TASKLET_SOFTIRQ,// Tasklet软中断SCHED_SOFTIRQ,// 调度软中断HRTIMER_SOFTIRQ,// 高精度定时器软中断RCU_SOFTIRQ,// RCU软中断NR_SOFTIRQS};
软中断数据结构

每个 CPU 维护一个软中断向量表 include/linux/interrupt.h:565-568:

structsoftirq_action{void(*action)(structsoftirq_action*);};
软中断执行流程

核心处理函数在 kernel/softirq.c:260:

asmlinkage __visiblevoid__softirq_entry__do_softirq(void){structsoftirq_action*h;__u32 pending;pending=local_softirq_pending();// 获取待处理软中断位图h=softirq_vec;while((softirq_bit=ffs(pending))){h+=softirq_bit-1;h->action(h);// 调用软中断处理函数pending>>=softirq_bit;}}

执行时机

  1. 上半部退出时(如果in_interrupt()为 false)
  2. ksoftirqd内核线程被唤醒时
  3. 明确调用do_softirq()
软中断注册
// kernel/softirq.c:654-655open_softirq(TASKLET_SOFTIRQ,tasklet_action);open_softirq(HI_SOFTIRQ,tasklet_hi_action);

6.1.3 Tasklet

Tasklet 是基于软中断的动态下半部机制,主要特点:

  • 同一个 Tasklet同一时刻只能在一个 CPU 上运行
  • 不同 Tasklet可以并行在不同 CPU 上运行
  • 不能睡眠
Tasklet 数据结构

定义在 include/linux/interrupt.h:620-631:

structtasklet_struct{structtasklet_struct*next;// 链表下一节点unsignedlongstate;// 状态(0/TASKLET_STATE_SCHED)atomic_tcount;// 引用计数(0=使能,非0=禁用)bool use_callback;// 是否使用新式callback APIunion{void(*func)(unsignedlongdata);// 旧式处理函数void(*callback)(structtasklet_struct*t);// 新式处理函数};unsignedlongdata;};
Tasklet 使用示例
// 定义和初始化DECLARE_TASKLET(my_tasklet,my_tasklet_handler);// 或者动态初始化structtasklet_structmy_tasklet;tasklet_setup(my_tasklet,my_tasklet_callback);// 调度 Tasklettasklet_schedule(&my_tasklet);// 处理函数voidmy_tasklet_callback(structtasklet_struct*t){// 这里不能睡眠printk("Tasklet running on CPU %d\n",smp_processor_id());}
Tasklet 执行流程

kernel/softirq.c:548-592:

staticvoidtasklet_action_common(structsoftirq_action*a,structtasklet_head*tl_head,unsignedintsoftirq_nr){structtasklet_struct*list;// 取出所有待处理的 taskletlist=tl_head->head;tl_head->head=NULL;while(list){structtasklet_struct*t=list;list=list->next;if(tasklet_trylock(t)){// 尝试获取锁(防止多CPU并发)if(!atomic_read(&t->count)){// 检查是否被禁用t->callback(t);// 执行 tasklettasklet_unlock(t);continue;}tasklet_unlock(t);}// 如果正在其他CPU运行,重新调度t->next=NULL;*tl_head->tail=t;__raise_softirq_irqoff(softirq_nr);}}

6.1.4 工作队列(Workqueue)

工作队列是最灵活的下半部机制,特点:

  • 内核进程上下文中执行
  • 可以睡眠(调用msleep()、等待信号量等)
  • 可以延迟执行
工作队列数据结构
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 16:43:11

3.39 相机标定与角点检测:工业视觉的基础技术,附完整代码

3.39 相机标定与角点检测:工业视觉的基础技术,附完整代码 引言 相机标定和角点检测是工业视觉的基础技术。本文将深入解析这些技术的原理和实现。 一、相机标定 1.1 标定原理 相机标定用于确定相机的内参和外参。 # 相机标定 import cv2 import numpy as npdef camera_…

作者头像 李华
网站建设 2026/3/26 23:44:03

3.34 RCNN算法详解:Selective Search、IOU、NMS,目标检测的开山之作

3.34 RCNN算法详解:Selective Search、IOU、NMS,目标检测的开山之作 引言 R-CNN是目标检测领域的开山之作,引入了Selective Search、IOU、NMS等关键技术。本文将深入解析R-CNN的原理和实现。 一、R-CNN概述 1.1 算法流程 R-CNN的流程:候选区域生成 -> 特征提取 -&g…

作者头像 李华
网站建设 2026/3/27 3:33:11

3.35 FastRCNN算法详解:RoI Pooling、多任务损失函数,速度提升10倍

3.35 FastRCNN算法详解:RoI Pooling、多任务损失函数,速度提升10倍 引言 Fast R-CNN是对R-CNN的改进,通过RoI Pooling和多任务损失函数,速度提升10倍。本文将深入解析Fast R-CNN的改进。 一、Fast R-CNN改进 1.1 主要改进 # Fast …

作者头像 李华
网站建设 2026/4/2 13:33:06

3步解锁AO3镜像站:同人作品稳定访问终极指南

3步解锁AO3镜像站:同人作品稳定访问终极指南 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site 还在为无法稳定访问AO3同人作品库而烦恼吗?AO3镜像站正是你需要的解决方案!这个开源项目…

作者头像 李华
网站建设 2026/4/9 12:06:58

Sign-Sacker:数字签名伪装技术的深度解析与实战应用

Sign-Sacker:数字签名伪装技术的深度解析与实战应用 【免费下载链接】Sign-Sacker 项目地址: https://gitcode.com/gh_mirrors/si/Sign-Sacker 在当今数字安全环境中,数字签名已成为验证软件真实性和完整性的重要机制。然而,这种安全…

作者头像 李华
网站建设 2026/4/7 9:44:10

AO3镜像站技术深度解析:构建无障碍同人文化交流平台

AO3镜像站技术深度解析:构建无障碍同人文化交流平台 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site AO3镜像站作为开源技术项目,致力于解决国内用户访问AO3同人作品库的网络障碍,通…

作者头像 李华