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

Linux内核中的中断处理机制详解

Linux内核中的中断处理机制详解引言中断处理机制是Linux内核中负责处理硬件中断的核心组件它确保硬件设备能够及时通知内核发生的事件从而实现设备与操作系统的高效交互。Linux内核的中断处理机制支持多种中断类型包括外部中断、内部中断、软中断等同时提供了丰富的中断管理功能如中断注册、中断处理、中断线程化等。本文将深入探讨Linux内核中的中断处理机制包括其设计原理、架构、核心机制和应用场景。中断的基本概念1. 什么是中断中断是指硬件设备或软件程序在执行过程中向CPU发出的信号要求CPU暂停当前的工作转而去处理该信号对应的事件。2. 中断的分类硬件中断由硬件设备产生的中断外部中断由外部设备产生的中断内部中断由CPU内部产生的中断软件中断由软件程序产生的中断软中断内核中的软中断机制系统调用应用程序通过系统调用触发的中断异常程序执行过程中产生的异常3. 中断的作用设备通知硬件设备通知CPU事件的发生提高效率避免CPU轮询设备状态实时响应及时处理紧急事件多任务支持支持多任务的并发执行Linux中断处理机制的架构1. 中断处理的层次结构Linux中断处理机制的层次结构主要包括硬件层硬件设备产生中断信号中断控制器层中断控制器负责中断的路由和优先级管理中断处理层内核的中断处理函数软中断层软中断机制处理耗时操作工作队列层工作队列处理可延迟的任务2. 核心组件中断控制器如PIC、APIC、MSI等中断描述符表IDT存储中断处理函数的地址中断请求线IRQ硬件设备连接的中断线中断处理函数处理具体中断的函数软中断内核中的软中断机制tasklet基于软中断的机制工作队列可延迟的任务队列3. 中断处理流程中断产生硬件设备产生中断信号中断响应CPU响应中断保存现场中断处理执行中断处理函数中断返回恢复现场继续执行被中断的程序中断控制器1. PIC可编程中断控制器PIC是早期的中断控制器如Intel 8259A。特点最多支持8个中断源可以级联使用最多支持64个中断源优先级固定2. APIC高级可编程中断控制器APIC是现代系统中使用的中断控制器。特点支持更多的中断源支持多处理器系统支持中断重定向支持动态优先级3. MSI消息信号中断MSI是一种基于消息的中断机制。特点不需要中断线支持更多的中断性能更好支持中断优先级中断处理函数1. 中断处理函数的注册#includelinux/interrupt.hintrequest_irq(unsignedintirq,irq_handler_thandler,unsignedlongflags,constchar*name,void*dev)参数irq中断号handler中断处理函数flags中断标志name设备名称dev设备数据2. 中断处理函数的实现irqreturn_tmy_interrupt(intirq,void*dev_id){// 处理中断// ...returnIRQ_HANDLED;}返回值IRQ_HANDLED中断已处理IRQ_NONE中断未处理IRQ_WAKE_THREAD唤醒中断线程3. 中断处理函数的释放voidfree_irq(unsignedintirq,void*dev_id);中断的下半部机制1. 为什么需要下半部中断处理函数需要快速执行中断处理函数应该尽可能快地完成耗时操作延迟处理耗时的操作应该延迟到中断处理后执行提高系统响应性减少中断关闭的时间2. 软中断软中断是Linux内核中的一种下半部机制。#includelinux/interrupt.h// 定义软中断enum{HI_SOFTIRQ0,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,BLOCK_SOFTIRQ,IRQ_POLL_SOFTIRQ,TASKLET_SOFTIRQ,SCHED_SOFTIRQ,HRTIMER_SOFTIRQ,RCU_SOFTIRQ,};// 注册软中断voidopen_softirq(intnr,void(*action)(structsoftirq_action*));// 触发软中断voidraise_softirq(intnr);3. tasklettasklet是基于软中断的一种下半部机制。#includelinux/interrupt.h// 定义taskletstructtasklet_structmy_tasklet;// tasklet处理函数voidmy_tasklet_func(unsignedlongdata){// 处理tasklet// ...}// 初始化tasklettasklet_init(my_tasklet,my_tasklet_func,0);// 调度tasklettasklet_schedule(my_tasklet);4. 工作队列工作队列是一种可以在进程上下文中执行的下半部机制。#includelinux/workqueue.h// 定义工作structwork_structmy_work;// 工作处理函数voidmy_work_func(structwork_struct*work){// 处理工作// ...}// 初始化工作INIT_WORK(my_work,my_work_func);// 调度工作schedule_work(my_work);中断线程化1. 为什么需要中断线程化提高系统实时性中断线程可以被调度支持中断优先级中断线程可以设置优先级更好的调试支持中断线程可以被调试器调试支持阻塞操作中断线程可以执行阻塞操作2. 中断线程的使用#includelinux/interrupt.h// 请求线程化中断request_threaded_irq(unsignedintirq,irq_handler_thandler,irq_handler_tthread_fn,unsignedlongflags,constchar*name,void*dev);参数handler快速中断处理函数thread_fn线程化中断处理函数其他参数与request_irq相同中断管理1. 中断的使能和禁止#includeasm/irqflags.h// 禁止本地中断local_irq_disable();// 使能本地中断local_irq_enable();// 保存并禁止中断unsignedlongflags;local_irq_save(flags);// 恢复中断local_irq_restore(flags);2. 特定中断的使能和禁止#includelinux/interrupt.h// 禁止中断disable_irq(unsignedintirq);// 使能中断enable_irq(unsignedintirq);// 同步禁止中断disable_irq_nosync(unsignedintirq);3. 中断亲和性#includelinux/cpumask.h// 设置中断亲和性intirq_set_affinity(unsignedintirq,conststructcpumask*cpumask);// 获取中断亲和性conststructcpumask*irq_get_affinity_mask(unsignedintirq);实际案例分析案例简单的中断驱动#includelinux/module.h#includelinux/kernel.h#includelinux/init.h#includelinux/interrupt.h#includelinux/gpio.h#defineGPIO_PIN23#defineIRQ_NAMEmyirqstaticirqreturn_tmy_interrupt(intirq,void*dev_id){printk(KERN_INFOmyirq: interrupt occurred\n);returnIRQ_HANDLED;}staticint__initmyirq_init(void){intirq;intret;// 请求GPIOif(!gpio_is_valid(GPIO_PIN)){printk(KERN_ERRmyirq: invalid GPIO\n);return-ENODEV;}retgpio_request(GPIO_PIN,IRQ_NAME);if(ret0){printk(KERN_ERRmyirq: failed to request GPIO\n);returnret;}// 设置GPIO方向gpio_direction_input(GPIO_PIN);// 获取IRQ号irqgpio_to_irq(GPIO_PIN);if(irq0){printk(KERN_ERRmyirq: failed to get IRQ\n);gpio_free(GPIO_PIN);returnirq;}// 请求中断retrequest_irq(irq,my_interrupt,IRQF_TRIGGER_RISING,IRQ_NAME,NULL);if(ret0){printk(KERN_ERRmyirq: failed to request IRQ\n);gpio_free(GPIO_PIN);returnret;}printk(KERN_INFOmyirq: init\n);return0;}staticvoid__exitmyirq_exit(void){intirqgpio_to_irq(GPIO_PIN);free_irq(irq,NULL);gpio_free(GPIO_PIN);printk(KERN_INFOmyirq: exit\n);}module_init(myirq_init);module_exit(myirq_exit);MODULE_LICENSE(GPL);MODULE_AUTHOR(Your Name);MODULE_DESCRIPTION(Simple interrupt driver);案例使用tasklet的中断驱动#includelinux/module.h#includelinux/kernel.h#includelinux/init.h#includelinux/interrupt.h#includelinux/gpio.h#defineGPIO_PIN23#defineIRQ_NAMEmyirqstaticstructtasklet_structmy_tasklet;staticvoidmy_tasklet_func(unsignedlongdata){printk(KERN_INFOmyirq: tasklet executed\n);}staticirqreturn_tmy_interrupt(intirq,void*dev_id){printk(KERN_INFOmyirq: interrupt occurred\n);tasklet_schedule(my_tasklet);returnIRQ_HANDLED;}staticint__initmyirq_init(void){intirq;intret;// 初始化tasklettasklet_init(my_tasklet,my_tasklet_func,0);// 请求GPIOif(!gpio_is_valid(GPIO_PIN)){printk(KERN_ERRmyirq: invalid GPIO\n);return-ENODEV;}retgpio_request(GPIO_PIN,IRQ_NAME);if(ret0){printk(KERN_ERRmyirq: failed to request GPIO\n);returnret;}// 设置GPIO方向gpio_direction_input(GPIO_PIN);// 获取IRQ号irqgpio_to_irq(GPIO_PIN);if(irq0){printk(KERN_ERRmyirq: failed to get IRQ\n);gpio_free(GPIO_PIN);returnirq;}// 请求中断retrequest_irq(irq,my_interrupt,IRQF_TRIGGER_RISING,IRQ_NAME,NULL);if(ret0){printk(KERN_ERRmyirq: failed to request IRQ\n);gpio_free(GPIO_PIN);returnret;}printk(KERN_INFOmyirq: init\n);return0;}staticvoid__exitmyirq_exit(void){intirqgpio_to_irq(GPIO_PIN);tasklet_kill(my_tasklet);free_irq(irq,NULL);gpio_free(GPIO_PIN);printk(KERN_INFOmyirq: exit\n);}module_init(myirq_init);module_exit(myirq_exit);MODULE_LICENSE(GPL);MODULE_AUTHOR(Your Name);MODULE_DESCRIPTION(Interrupt driver with tasklet);结论Linux内核的中断处理机制是一个功能强大、设计完善的中断管理系统它确保硬件设备能够及时通知内核发生的事件从而实现设备与操作系统的高效交互。通过深入了解Linux中断处理机制的架构、核心组件和实现原理我们可以更好地开发和调试中断驱动程序提高系统的响应性和可靠性。在实际应用中我们需要根据设备的特性选择合适的中断处理方式合理使用下半部机制确保中断处理函数快速执行耗时操作延迟处理。作为系统开发者和驱动工程师掌握中断处理机制的知识是非常重要的它将帮助我们更好地设计和实现设备驱动程序解决中断相关的问题提高系统的性能和稳定性。

相关文章:

Linux内核中的中断处理机制详解

Linux内核中的中断处理机制详解 引言 中断处理机制是Linux内核中负责处理硬件中断的核心组件,它确保硬件设备能够及时通知内核发生的事件,从而实现设备与操作系统的高效交互。Linux内核的中断处理机制支持多种中断类型,包括外部中断、内部中断…...

5分钟精通B站音频提取:BilibiliDown高效解决方案与实战指南

5分钟精通B站音频提取:BilibiliDown高效解决方案与实战指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirr…...

如何解决数位板跨平台兼容难题?OpenTabletDriver开源驱动的一站式配置体验

如何解决数位板跨平台兼容难题?OpenTabletDriver开源驱动的一站式配置体验 【免费下载链接】OpenTabletDriver Open source, cross-platform, user-mode tablet driver 项目地址: https://gitcode.com/gh_mirrors/op/OpenTabletDriver OpenTabletDriver是一款…...

告别Windows 11卡顿烦恼:如何用Win11Debloat让系统性能提升60%

告别Windows 11卡顿烦恼:如何用Win11Debloat让系统性能提升60% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutte…...

【故障公告】数据库服务器磁盘 MBPS 高造成 :-: 期间全站故障爬

Issue 概述 先来看看提交这个 Issue 的作者是为什么想到这个点子的,以及他初步的核心设计概念。?? 本 PR 实现了 Apache Gravitino 与 SeaTunnel 的集成,将其作为非关系型连接器的外部元数据服务。通过 Gravitino 的 REST API 自动获取表结构和元数据&…...

FLUX.1-schnell:如何用12B参数模型重塑创意产业工作流

FLUX.1-schnell:如何用12B参数模型重塑创意产业工作流 【免费下载链接】FLUX.1-schnell 项目地址: https://ai.gitcode.com/hf_mirrors/black-forest-labs/FLUX.1-schnell 在人工智能图像生成领域,一个模型的质量往往由其参数规模决定。FLUX.1-s…...

电脑风扇噪音如何解决?智能温控系统全攻略

电脑风扇噪音如何解决?智能温控系统全攻略 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanControl…...

OpenClaw替代脚本:Qwen3.5-9B实现复杂自动化优势

OpenClaw替代脚本:Qwen3.5-9B实现复杂自动化优势 1. 为什么需要重新思考自动化工具链 三周前的一个深夜,我盯着屏幕上第17次报错的Python脚本发呆。这个用来批量重命名设计稿文件的脚本,因为文件名中突然出现的emoji字符再次崩溃。就在这个…...

OpenStego:用隐写术实现信息隐蔽传输与版权保护的开源方案

OpenStego:用隐写术实现信息隐蔽传输与版权保护的开源方案 【免费下载链接】openstego OpenStego is a steganography application that provides two functionalities: a) Data Hiding: It can hide any data within an image file. b) Watermarking: Watermarking…...

higress 这个中登才是AI时代的心头好峭

核心摘要:这篇文章能帮你 ?? 1. 彻底搞懂条件分支与循环的适用场景,告别选择困难。 ?? 2. 掌握遍历DOM集合修改属性的标准姿势与性能窍门。 ?? 3. 识别流程控制中的常见“坑”,并学会如何优雅地绕过去。 ?? 主要内容脉络 ?? 一、痛…...

CKKS 同态加密数学基础推导昧

背景 StreamJsonRpc 是微软官方维护的用于 .NET 和 TypeScript 的 JSON-RPC 通信库,以其强大的类型安全、自动代理生成和成熟的异常处理机制著称。在 HagiCode 项目中,为了通过 ACP (Agent Communication Protocol) 与外部 AI 工具(如 iflow …...

RAG 还是 Lucene:私有化部署客服系统的 AI 知识库架构选型偌

在之前的文章中,我们花了大量的篇幅,从记录后端pod真实ip开始说起,然后引入envoy,再解决了各种各样的需求:配置自动重载、流量劫持、sidecar自动注入,到envoy的各种能力:熔断、流控、分流、透明…...

效率倍增:OpenClaw+Phi-3-vision-128k-instruct自动化处理每日重复工作

效率倍增:OpenClawPhi-3-vision-128k-instruct自动化处理每日重复工作 1. 为什么我们需要自动化日常办公 每天早上打开电脑,总有一堆重复性工作等着我:整理邮件、生成报表、写会议纪要。这些工作消耗了我至少2小时的高效时间。直到我尝试用…...

Spring Boot 与 GraalVM 原生镜像 2026:极致性能优化

Spring Boot 与 GraalVM 原生镜像 2026:极致性能优化 今天我们来聊聊 Spring Boot 与 GraalVM 原生镜像,这是实现 Java 应用极致性能优化的重要技术。 一、什么是 GraalVM 原生镜像 GraalVM 原生镜像(Native Image)是一种提前编译…...

Applite终极指南:macOS上最简单免费的Homebrew Cask图形化管理工具

Applite终极指南:macOS上最简单免费的Homebrew Cask图形化管理工具 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite Applite是一款专为macOS用户设计的开源图形界面…...

嵌入式开发工具链实战指南与效率提升

1. 嵌入式开发工具全景概览在嵌入式系统开发领域,工程师们每天都要面对交叉编译、调试、性能分析等重复性工作。经过十五年的一线开发实践,我整理出一套能显著提升效率的工具组合,这些工具覆盖了从芯片选型到产品发布的完整生命周期。不同于网…...

阻抗匹配原理与工程实践全解析

1. 阻抗匹配基础概念解析阻抗匹配是电子工程中最基础也最容易被忽视的技术要点之一。记得我刚入行时,第一次调试射频电路就栽在这个坑里——信号反射导致系统根本没法正常工作。阻抗匹配的本质,就是让信号源阻抗与负载阻抗达到共轭匹配状态,实…...

STM32智能遥控婴儿车设计与实现

1. 项目概述这个基于STM32的智能遥控婴儿车项目,是我在去年为朋友家新生儿设计的实用型作品。当时朋友抱怨市面上智能婴儿车要么功能单一,要么价格昂贵,于是萌生了DIY一个多功能、低成本解决方案的想法。经过三个月的迭代开发,最终…...

突破VMware限制:解锁macOS虚拟机的实战指南

突破VMware限制:解锁macOS虚拟机的实战指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 在虚拟化技术蓬勃发展的今天,VMware作为行业标杆却对macOS系统支持设置了重重限制。本…...

基于组件化架构的Bilibili-Evolved性能优化实战:实现60fps流畅播放与40%内存占用降低

基于组件化架构的Bilibili-Evolved性能优化实战:实现60fps流畅播放与40%内存占用降低 【免费下载链接】Bilibili-Evolved 强大的哔哩哔哩增强脚本 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved Bilibili-Evolved作为一款强大的哔哩哔哩增强…...

OpenClaw版本升级指南:千问3.5-27B镜像兼容性测试与迁移

OpenClaw版本升级指南:千问3.5-27B镜像兼容性测试与迁移 1. 为什么需要这篇指南 上周五晚上11点,我的OpenClaw突然弹出一条警告:"当前版本即将停止维护"。作为一个重度依赖OpenClaw自动化处理日报和周报的用户,我意识…...

大卫小东(Sheldon)抑

Issue 概述 先来看看提交这个 Issue 的作者是为什么想到这个点子的,以及他初步的核心设计概念。?? 本 PR 实现了 Apache Gravitino 与 SeaTunnel 的集成,将其作为非关系型连接器的外部元数据服务。通过 Gravitino 的 REST API 自动获取表结构和元数据&…...

[具身智能-320]:语料库就是“语言材料的仓库”。

简单来说,语料库就是“语言材料的仓库”。在人工智能和语言学领域,它指的是经过科学取样、加工和整理的大规模电子文本或数据集合。如果把大语言模型(LLM)比作一个正在上学的孩子,那么语料库就是它读的“书”、做的“题…...

[具身智能-319]:分词器的词典的内容有哪些因素决定,该字典中的内容是如何构建的?英文的分词器字典多大?中文的分词器字典有多大?分别举例说明分词器字典中的内容?

分词器的词典(Vocabulary)是决定大语言模型如何“看”世界的关键组件。它不仅仅是一个单词列表,更是一个包含了各种粒度文本单元及其对应数字编号(Token ID)的映射表。 以下为你详细解析词典的决定因素、构建过程、英…...

[具身智能-318]:分词 (Tokenization)原理和代码示例

分词(Tokenization)是大语言模型(LLM)的“第一公里”,它的核心任务是将人类可读的自然语言文本,转换为模型能够理解和处理的数字序列。简单来说,分词器(Tokenizer)就是一…...

2025项目管理工具深度评测:Gitee如何引领技术团队敏捷转型

数字化转型浪潮下的项目管理革命 2025年的企业数字化转型已进入深水区,项目管理工具作为企业效率的核心引擎,正在经历从功能堆砌到智能协同的质变。在这场变革中,Gitee作为中国最大的代码托管平台,其项目管理模块的全面升级正在重…...

007、记忆(Memory)机制:让AI拥有对话上下文的能力

007、记忆(Memory)机制:让AI拥有对话上下文的能力 昨天深夜调试一个对话机器人,用户问“今天的天气怎么样?”,系统返回了天气信息;接着用户又问“那明天呢?”,结果机器人…...

008、对话链实战:调试一个“失忆”的智能对话助手

008、对话链实战:调试一个“失忆”的智能对话助手 昨天在调试一个基于LangChain的客服原型时,遇到了一个典型问题:每次用户问“我刚才说了什么?”,助手都回答“我不知道您之前说了什么”。这暴露了对话链最核心的问题—…...

智能家居中枢:OpenClaw通过Qwen3.5-9B控制HomeKit设备

智能家居中枢:OpenClaw通过Qwen3.5-9B控制HomeKit设备 1. 为什么需要AI控制智能家居? 去年装修新房时,我安装了二十多个HomeKit设备。每天早晨需要对着手机喊"Siri打开窗帘",晚上又要手动设置"影院模式"。这…...

Linux I/O 演进史:从管道到零拷贝,一篇串起个服务端核心原语倍

前言 在使用 kubectl get $KIND -o yaml 查看 k8s 资源时,输出结果中包含大量由集群自动生成的元数据(如 managedFields、resourceVersion、uid 等)。这些信息在实际复用 yaml 清单时需要手动清理,增加了额外的工作量。 使用 kube…...