news 2026/4/23 17:12:33

[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/23 9:49:27

3.38 工业缺陷检测实战:物体表面缺陷检测,从图像处理到深度学习

3.38 工业缺陷检测实战:物体表面缺陷检测,从图像处理到深度学习 引言 工业缺陷检测是视觉算法的重要应用,本文通过实战案例演示从图像处理到深度学习的完整流程。 一、缺陷检测概述 1.1 任务定义 # 缺陷检测任务 def defect_detection_task():"""缺陷检…

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

ReactPage智能内容导出:从编辑器到演示文稿的高效转换方案

ReactPage智能内容导出:从编辑器到演示文稿的高效转换方案 【免费下载链接】react-page 项目地址: https://gitcode.com/gh_mirrors/ed/editor ReactPage作为业界领先的React页面编辑器,不仅提供了强大的内容创作能力,更通过创新的内…

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

2026年白帽黑客最佳笔记本选购指南 (1)

2026年白帽黑客最佳笔记本选购指南 【声明】本文内容仅供学习交流使用,不得用于非法用途。任何未授权的渗透测试都是违法行为。 若您立志成为2026年的白帽黑客或网络安全从业者,选择专业笔记本至关重要。与普通用户不同,白帽黑客需高性能设备…

作者头像 李华
网站建设 2026/4/22 10:59:54

深度测评专科生必用TOP8 AI论文平台:开题报告文献综述全解析

深度测评专科生必用TOP8 AI论文平台:开题报告文献综述全解析 专科生论文写作的高效助手:AI平台测评榜单出炉 随着人工智能技术在教育领域的不断渗透,越来越多的专科生开始借助AI工具提升论文写作效率。然而,面对市场上琳琅满目的A…

作者头像 李华
网站建设 2026/4/23 13:02:58

Sign-Sacker签名掠夺者:数字签名伪装技术的完整使用指南

Sign-Sacker签名掠夺者:数字签名伪装技术的完整使用指南 【免费下载链接】Sign-Sacker 项目地址: https://gitcode.com/gh_mirrors/si/Sign-Sacker 在当今网络安全环境中,数字签名已成为验证软件真实性和完整性的重要手段。Sign-Sacker签名掠夺者…

作者头像 李华
网站建设 2026/4/23 11:14:04

怎样高效转换网页内容:ReactPage实用演示文稿生成方案

怎样高效转换网页内容:ReactPage实用演示文稿生成方案 【免费下载链接】react-page 项目地址: https://gitcode.com/gh_mirrors/ed/editor 在现代web开发中,ReactPage作为强大的React页面编辑器,提供了丰富的组件和布局功能&#xff…

作者头像 李华