news 2026/3/22 8:39: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/3/21 4:25:34

小米运动智能刷步神器:轻松同步微信支付宝步数全攻略

小米运动智能刷步神器:轻松同步微信支付宝步数全攻略 【免费下载链接】mimotion 小米运动刷步数(微信支付宝)支持邮箱登录 项目地址: https://gitcode.com/gh_mirrors/mimo/mimotion 还在为每天运动步数太少而发愁吗?想不想…

作者头像 李华
网站建设 2026/3/17 6:53:54

揭秘n8n自动化工作流:从效率瓶颈到智能决策的思维跃迁

揭秘n8n自动化工作流:从效率瓶颈到智能决策的思维跃迁 【免费下载链接】n8n n8n 是一个工作流自动化平台,它结合了代码的灵活性和无代码的高效性。支持 400 集成、原生 AI 功能以及公平开源许可,n8n 能让你在完全掌控数据和部署的前提下&…

作者头像 李华
网站建设 2026/3/18 7:33:26

终极指南:WenQuanYi Micro Hei轻量级中文字体的完整配置方案

终极指南:WenQuanYi Micro Hei轻量级中文字体的完整配置方案 【免费下载链接】fonts-wqy-microhei Debian package for WenQuanYi Micro Hei (mirror of https://anonscm.debian.org/git/pkg-fonts/fonts-wqy-microhei.git) 项目地址: https://gitcode.com/gh_mir…

作者头像 李华
网站建设 2026/3/18 10:43:42

AO3镜像站完整部署方案:如何构建稳定的访问通道

AO3镜像站完整部署方案:如何构建稳定的访问通道 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site 当你发现AO3原站无法访问时,这个开源镜像站项目提供了完整的技术解决方案。通过智能同步机制&am…

作者头像 李华
网站建设 2026/3/15 15:05:37

51单片机串口通信程序详解

51单片机串口通信程序源码,注释详细,包含接收和传输代码,以及文档说明在51单片机的应用中,串口通信是非常重要的功能,它可以实现单片机与其他设备的数据交互。今天就来详细剖析一下51单片机串口通信的程序源码&#xf…

作者头像 李华
网站建设 2026/3/15 17:15:02

开发基于大模型的金融专业教学案例动态生成器

开发基于大模型的金融专业教学案例动态生成器关键词:大模型、金融专业教学案例、动态生成器、自然语言处理、人工智能教育应用摘要:本文聚焦于开发基于大模型的金融专业教学案例动态生成器。首先介绍了该项目的背景,包括目的、预期读者、文档…

作者头像 李华