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

Linux内核学习记录

中断控制

Robert Love的LKD中提到了用于关闭和开启中断的API

local_irq_disable();
local_irq_enable();

秉持着学习的原则,我们很自然的就会想看当前6.X内核的实现,

//include/linux/irqflags.h
#define local_irq_enable()	do { raw_local_irq_enable(); } while (0)
#define local_irq_disable()	do { raw_local_irq_disable(); } while (0)

可以看到这两个函数由宏进行实现,继续往下找:

//include/linux/irqflags.h
#define raw_local_irq_disable()		arch_local_irq_disable()
#define raw_local_irq_enable()		arch_local_irq_enable()//...static __always_inline void arch_local_irq_disable(void)
{native_irq_disable();
}static __always_inline void arch_local_irq_enable(void)
{native_irq_enable();
}

最后我们来到arch/x86/include/asm/irqflags.h:

arch/x86/include/asm/irqflags.h
static __always_inline void native_irq_disable(void)
{asm volatile("cli": : :"memory");
}static __always_inline void native_irq_enable(void)
{asm volatile("sti": : :"memory");
}

可以看到在x86_64体系结构下,中断的开启和关闭由指令cli和sti进行控制

顺便在看看aarch64:

static __always_inline void __daif_local_irq_disable(void)
{barrier();asm volatile("msr daifset, #3");barrier();
}static __always_inline void __daif_local_irq_enable(void)
{barrier();asm volatile("msr daifclr, #3");barrier();
}

barrier() 在这里起到的作用(来自Gemini3 Pro):

  • 防止乱序 (Stop Reordering): 编译器(如 GCC)为了让程序跑得更快,通常会打乱代码的执行顺序。barrier() 就像一道墙,它告诉编译器:“墙上面的代码必须在墙上面执行,墙下面的代码必须在墙下面执行,不准跨越。

  • 防止乱序 (Stop Reordering): 编译器(如 GCC)为了让程序跑得更快,通常会打乱代码的执行顺序。barrier() 就像一道墙,它告诉编译器:“墙上面的代码必须在墙上面执行,墙下面的代码必须在墙下面执行,不准跨越。

  • 保护临界区 (Protect Critical Section): 在“关中断”和“开中断”之间的代码(临界区)是非常敏感的。

    • 如果没有 barrier(),编译器可能会把本该在临界区内执行的变量读写操作,移到关中断之前(导致竞态)或开中断之后。

    • barrier() 强制编译器把关键代码老老实实地放在这两条汇编指令中间。

  • 只针对编译器 (Software only): 它不会生成任何 CPU 机器指令(它是空的汇编指令 asm volatile("": : :"memory"))。它只约束编译阶段,不影响 CPU 运行时的乱序(那是内存屏障 dmb/dsb 的事)。

http://www.zskr.cn/news/74999.html

相关文章:

  • ret2libc+一点点保护
  • 详细介绍:【数据库】国产数据库替代实战:金仓KES如何以“智能运维 + 低资源占用”年省百万运维成本?
  • 2025年广东地区湘菜供应链江西小炒社区厨房称重自选食材配送服务商TOP5评测!全品类供应+定制化服务权威榜单发布,赋能餐饮高效运营
  • 『NAS』在群晖部署一款好看的白板工具-Excalidraw
  • Ubuntu下,MySQL密码遗失时修改密码
  • 2025最新贵州伴手礼厂家/采购渠道/供应商/平台/卖场/超市TOP5推荐!地道风物+文化赋能权威榜单发布,甄选贵礼传递黔地心意
  • 001.makdown快速入门
  • Oracel VirtualBox安装Windows11时无法找到ISO文件或不满足系统要求
  • 构建个人知识库新选择:深度解析访答本地私有知识库
  • AIShareTxt入门:快速准确高效的为金融决策智能体提供股票实用的技术指标上下文
  • I know only one topic but I wear glasses in 20s
  • 云原生基石的试金石:基于 openEuler 部署 Docker 与 Nginx 的全景实录 - 指南
  • qemu如何和宿主机共享文件 - show
  • 2025贵州贵阳荣和酒坊采购渠道推荐!百年传承酱香白酒购买平台TOP5榜单发布,品味历史沉淀的醇香佳酿
  • UE5循环播放蒙太奇
  • 完整教程:神经网络—— 学习与感知器
  • 智能座舱
  • 团体设计天梯赛L1题解
  • 完整教程:乡镇外卖跑腿小程序开发实战:基于PHP的乡镇同城O2O
  • 关于博客后续
  • 2025.12.6博客
  • 英语_阅读_a robot for science fair_待读
  • 2025年什么牌子的轮胎比较好:权威测评优质轮胎排行
  • faster r cnn中的动量
  • 需求的分层
  • 12.5 程序员修炼之道:从小工到专家 第7章 在项目开始之前 - GENGAR
  • 理想L9更换轮胎推荐:2025年超500万用户力荐的组合
  • 小红书玩疯了!Ai像素级拆解提示词+Nano Banan Pro免费使用教程(附Api接入实战)
  • 2025.12.6日20:13-harsh无情的;粗糙的
  • 软件需求分析