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

3.3_第一行之hard_local_irq_disable

3.3 第一行之hard_local_irq_disable

3.3.1 Linux中断的使能与屏蔽

3.3.1.1 中断使能与屏蔽的三重关卡

本章的主题是hard_local_irq_disable(),它是对中断的关闭操作。为了彻底搞清楚中断关闭的机制,这里先对Linux使能与屏蔽中断的API做详细的分析,然后再分析IPIPE做了哪些针对性地改造。这里分析的范围已经超过了hard_local_irq_disable()。如果只关心hard_local_irq_disable(),可以只看第三重关卡的分析与改造。

硬件控制器的物理中断发生后,到执行中断处理程序IRQ Handler,这中间要经历3重关卡。

在这里插入图片描述

3.3.1.2 第一重关卡IMR

第一重关卡指的是硬件控制器自身的中断屏蔽寄存器IMR(Interrupt Mask Register)。以SPI控制器为例,SPI_IMR[4]为0时代表RX FIFO FULL中断被屏蔽,为1时代表RX FIFO FULL中断被使能。在driver/spi/spi-rockchip.c驱动中,由驱动自行根据需要来管理中断屏蔽位。例如使能RX FIFO FULL中断,则调用:

writel_relaxed(INT_RF_FULL, rs->regs + ROCKCHIP_SPI_IMR);

其寄存器定义如下:

在这里插入图片描述

3.3.1.3 第二重关卡中断控制器的使能bit

第二重关卡指的是中断控制器的使能bit。以GIC V3为例,每个中断号都有一个enable bit,可以通过GICD_ISENABLER寄存器来set-enable使能中断,通过GICD_ICENABLER寄存器来clear-enable屏蔽中断。在kernel/irq/manage.c,定义了如下接口:

//关闭中断,在非中断处理程序中使用,会等待中断处理程序完成
void disable_irq(unsigned int irq) //关闭中断:在中断处理程序中使用,不会等待,避免自己等待自己造成死锁
void disable_irq_nosync(unsigned int irq) //使能中断
void enable_irq(unsigned int irq)

以disable_irq为例,来追踪一下是如何修改中断控制器的使能bit的。

disable_irq <kernel/irq/manage.c>->	__disable_irq_nosync <kernel/irq/manage.c>->	__disable_irq  <kernel/irq/manage.c>->	irq_disable <kernel/irq/chip.c>->	__irq_disable <kernel/irq/chip.c>

其中最后一级的调用__irq_disable,它开始了一顿让人迷惑的操作,下面展开说一下。

在这里插入图片描述

第1行,第一个入参struct irq_desc *desc是指向中断描述符的指针,为方便讨论,以下简称中断描述符。第二个入参mask涉及到内核的一个精巧的设计。先看一下这个参数是如何传递下来的。

kernel/irq/chip.c:void irq_disable(st

文章转载自:

http://UZ8bKDIz.jnkng.cn
http://XJEceEnb.jnkng.cn
http://H8Phid8N.jnkng.cn
http://VqDgoXMQ.jnkng.cn
http://h8ctIV04.jnkng.cn
http://wDsyaCWu.jnkng.cn
http://dLkRzgeA.jnkng.cn
http://UfUTWfzf.jnkng.cn
http://BhNb559P.jnkng.cn
http://Udrmhgj7.jnkng.cn
http://YCvXSMVY.jnkng.cn
http://3ryHHIwf.jnkng.cn
http://T62oyb7I.jnkng.cn
http://QmO1hR4P.jnkng.cn
http://YhUkqKOc.jnkng.cn
http://yRkooyqB.jnkng.cn
http://JcDOkzGF.jnkng.cn
http://gXO03e9j.jnkng.cn
http://pUpkQfc9.jnkng.cn
http://ZcBopKup.jnkng.cn
http://VRL8amqB.jnkng.cn
http://knoTowKf.jnkng.cn
http://Ljganufw.jnkng.cn
http://lWrmY9Cj.jnkng.cn
http://ghMokcXz.jnkng.cn
http://jvJudFtM.jnkng.cn
http://G947JwuJ.jnkng.cn
http://oL1uuJQa.jnkng.cn
http://kphDzEDw.jnkng.cn
http://b6TKNhH7.jnkng.cn
http://www.dtcms.com/a/368667.html

相关文章:

  • 汽车 信息娱乐系统 概览
  • 将已有 Vue 项目通过 Electron 打包为桌面客户端的完整步骤
  • Nginx 配置片段主要用于实现​​正向代理​​,可以用来转发 HTTP 和 HTTPS 请求
  • 有鹿机器人的365天奇幻日记:我在景区当扫地僧
  • C++算法专题学习——分治
  • 智能工单路由系统(Java)
  • 生成模型实战 | 深度分层变分自编码器(Nouveau VAE,NVAE)
  • Windows多开文件夹太乱?Q-Dir四窗口同屏,拖拽文件快一倍
  • 测试驱动开发 (TDD) 与 Claude Code 的协作实践详解
  • Bug 排查日记:打造高效问题定位与解决的技术秘籍
  • MySQL InnoDB索引机制
  • Nextcloud 实战:打造属于你的私有云与在线协作平台
  • linux上nexus安装教程
  • vosk语音识别实战
  • 美团发布 | LongCat-Flash最全解读,硬刚GPT-4.1、Kimi!
  • 七彩喜微高压氧舱:科技与体验的双重革新,重新定义家用氧疗新标杆
  • Gemini-2.5-Flash-Image-Preview 与 GPT-4o 图像生成能力技术差异解析​
  • 敏捷开发-Scrum(上)
  • 超越自动化:为什么说供应链的终局是“AI + 人类专家”的混合智能?
  • 一维水动力模型有限体积法(三):戈杜诺夫框架与近似黎曼求解器大全
  • 2025年互联网行业高含金量证书盘点!
  • 数据库存储大量的json文件怎么样高效的读取和分页,利用文件缓存办法不占用内存
  • springboot redis 缓存入门与实战
  • 在 vue-vben-admin(v5 版本)中,使用 ECharts 图表(豆包版)
  • 数码视讯TR100-OTT-G1_国科GK6323_安卓9_广东联通原机修改-TTL烧录包-可救砖
  • RWA 技术:让实体消费积分变身可信数字资产
  • 蚂蚁 S21 XP+ HYD 500T矿机评测:SHA-256算法与高效冷却技术的结合
  • DAY1:错题日记
  • 直播美颜SDK的技术架构剖析:人脸美型功能的实现原理与优化策略
  • Kafka 消息队列:揭秘海量数据流动的技术心脏