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

Linux内核禁止_开启中断和处理器间中断

禁止_开启中断

一、ARM64 架构下全局中断控制函数解析

在 ARM64 架构中,内核通过特定函数实现全局中断的禁止与开启,具体如下:

1. 禁止全局中断
  • 函数调用链local_irq_disable() --> raw_local_irq_disable() --> arch_local_irq_disable()
  • 内核源码
    static inline void arch_local_irq_disable(void) {  
        asm volatile(  
            "msr daifset, #2 // 通过汇编设置中断屏蔽位为1,禁止可屏蔽中断响应\n"  
            : : : "memory");  
    }  
    
  • 作用:将处理器中断屏蔽位设为 1,使处理器不响应可屏蔽中断(但不可屏蔽中断 NMI 除外)。
2. 开启全局中断
  • 函数local_irq_enable(),底层调用arch_local_irq_enable()
  • 内核源码
    static inline void arch_local_irq_enable(void) {  
        asm volatile(  
            "msr daifclr, #2 // 清除中断屏蔽位,允许可屏蔽中断响应\n"  
            : : : "memory");  
    }  
    
  • 作用:将中断屏蔽位设为 0,恢复处理器对可屏蔽中断的响应。
3. 保存中断状态并禁止中断
  • 函数local_irq_save(flags)
  • 作用:先将当前中断状态存入flags,再禁止中断。适用于需恢复中断状态的场景,如:
    unsigned long flags;  
    local_irq_save(flags); // 保存中断状态并禁止中断  
    // 临界区代码  
    local_irq_restore(flags); // 恢复中断状态  
    
4. 恢复中断状态
  • 函数local_irq_restore(flags),与local_irq_save配合,恢复之前保存的中断状态。
5. 使用注意
  • local_irq_disablelocal_irq_enable不可嵌套,否则中断状态混乱。
  • local_irq_savelocal_irq_restore支持嵌套,因每次保存的状态记录对应层级的中断开关情况。

二、单个中断的禁止与开启

Linux 内核支持针对单个外设中断的控制,灵活屏蔽特定设备中断。

1. 禁止单个外设中断
  • 函数void disable_irq(unsigned int irq)
  • 作用:禁止指定中断号irq的外设中断,中断控制器不再转发该设备的中断请求。
    disable_irq(128); // 禁止中断号为128的设备(如网卡)的中断  
    
2. 开启单个外设中断
  • 函数void enable_irq(unsigned int irq)
  • 作用:重新开启指定中断号irq的外设中断,恢复中断控制器对该设备中断请求的转发。
    enable_irq(128); // 开启中断号为128的设备的中断  

处理器间中断

        处理器间中断(Inter-Processor Interrupt)是一种特殊的中断,在多处理器系统中,一个处理器可以向其他处理器发送中断,要求目标处理器执行某件事情。

        常见的使用处理器间中断的函数:

        对于 ARM64 架构的 GIC 控制器,把处理器间中断称为软件生成的中断,可以写分发器的寄存器以生成处理器间中断(GICD_SGIR 软件生成中断寄存器 Software Generated Interrupt Register)。

        负责处理处理器间中断的函数是handle_IPI():

处理处理器间中断的流程如下:

         比如处理器正在用户模式(异常级别0)下执行64位应用程序,中断控制器是GIC v2控制器,处理处理器间中断的执行流程如下:

 https://github.com/0voice


文章转载自:
http://chromaticism.apjjykv.cn
http://ahem.apjjykv.cn
http://astropologist.apjjykv.cn
http://charcuterie.apjjykv.cn
http://abend.apjjykv.cn
http://antipyrin.apjjykv.cn
http://cadastral.apjjykv.cn
http://assertion.apjjykv.cn
http://argala.apjjykv.cn
http://bandspreading.apjjykv.cn
http://camberwell.apjjykv.cn
http://appressorium.apjjykv.cn
http://biofacies.apjjykv.cn
http://candescent.apjjykv.cn
http://adventuristic.apjjykv.cn
http://arum.apjjykv.cn
http://becharm.apjjykv.cn
http://centistere.apjjykv.cn
http://alkalinize.apjjykv.cn
http://acme.apjjykv.cn
http://caramelize.apjjykv.cn
http://axisymmetrical.apjjykv.cn
http://adult.apjjykv.cn
http://assignments.apjjykv.cn
http://agentive.apjjykv.cn
http://callithumpian.apjjykv.cn
http://centremost.apjjykv.cn
http://caricature.apjjykv.cn
http://acervulus.apjjykv.cn
http://avt.apjjykv.cn
http://www.dtcms.com/a/97145.html

相关文章:

  • 鸿蒙前后端项目源码-点餐v3.0-原创!原创!原创!
  • js关于for of 与for in
  • webpack和vite之间的区别
  • 从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换
  • Linux:基础IO---缓冲区
  • 1688商品详情接口:深度解析与应用实践
  • 基于社交裂变的S2B2C电商模式创新研究——以“颜值PK+礼品卡+AI智能名片“融合生态为例
  • JDK 17 + Spring Boot 3 全栈升级实战指南--从语法革新到云原生,解锁企业级开发新范式
  • 学习openfoam的两个地方(案例和源码)
  • MATLAB中构建模式表达式
  • Python 在Word中查找并替换文本
  • git在实践使用中的操作流程
  • 力扣:回溯算法
  • 获客、留客、复购...如何利用易境通集运系统越过“三座大山”?
  • 【AI工具开发】Notepad++插件开发实践:从基础交互到ScintillaCall集成
  • AI正在接管你的生活:2025年互联网生存指南
  • 全国职业技能大赛_网络安全_中职A模块解析
  • Leetcode-100 回溯法-电话号码的字母组合
  • 初识Qt(一)
  • 经销商订货管理系统小程序PHP+uniapp
  • beamforming
  • 免费使用!OpenAI 全量开放 GPT-4o 图像生成能力!
  • java基础知识和语法
  • S32K144外设实验(六):FTM输出单路PWM
  • JVM 如何打破双亲委派模型?
  • Arduino硬件控制开发基础资料
  • 消息队列Message Queue
  • Baklib内容中台的核心定位是什么?
  • 创新驱动 智领未来丨中威电子全景展示高速公路数字化创新成果
  • rent8_wechat-新增提醒收租功能