当前位置: 首页 > 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.jsqmd.com/news/64447/

相关文章:

  • CSP2024 游记
  • 12.6(1)
  • 如何调代码
  • ret2libc+一点点保护
  • AlmaLinux下mysql 8安装与数据迁移
  • ICPC Region 游记
  • 12.6(2)
  • Replicate 加入 Cloudflare:构建网络即计算机的下一代 AI 基础设施
  • abc435_f
  • Ubuntu下,MySQL修改端口号
  • 记CACC 2025区域赛
  • K8S中Ingress的采用
  • 深入解析:Chrome插件:实现Axure RP HTML原型的便捷预览
  • Ubuntu下,MySQL查询报错sql_mode=only_full_group_by
  • CRNN
  • 2025年广东地区湘菜供应链江西小炒社区厨房称重自选食材配送服务商TOP5评测!全品类供应+定制化服务权威榜单发布,赋能餐饮高效运营
  • 详细介绍:【数据库】国产数据库替代实战:金仓KES如何以“智能运维 + 低资源占用”年省百万运维成本?
  • 学习心得
  • 『NAS』在群晖部署一款好看的白板工具-Excalidraw
  • 方差的迭代计算公式 - 指南
  • Ubuntu下,MySQL密码遗失时修改密码
  • 一些特性的演变过程(C++11、C++14、C++17、C++20)
  • 支离破碎发言(七)
  • MD-FPN
  • 2025最新贵州特产/伴手礼供应商TOP5推荐!贵州/贵阳/遵义/毕节/黔东南特产选购平台/渠道/供应商/采购渠道榜单发布,甄选贵州地道风物好礼
  • 进程监控:通过 SSH 远程监测嵌入式设备进程重启
  • 街头徒手健身3硬核核心训练
  • 我们的休闲娱乐区,会变成什么样子(哽咽)
  • 【ZeroRange WebRTC】对称加密 vs 非对称加密(从原理到实践) - 详解
  • Cloudflare成功抵御AISURU僵尸网络发起的破纪录29.7 Tbps DDoS攻击