Linux Kernel(armv8-aarch64) 的原子操作的底层实现

通常我们代码中的a = a + 1这样的一行语句,翻译成汇编后蕴含着 3 条指令:
ldr x0, &a add x0,x0,#1 str x0,&a即
(1) 从内存中读取 a 变量到 x0 寄存器
(2)x0 寄存器加 1
(3) 将 x0 写入到内存 a 中
既然是 3 条指令,那么就有可能并发,也就意味着返回的结果可能不说预期的。
然后在 linux kernel 的操作系统中,提供访问原子变量的函数,用来解决上述问题。其中部分原子操作的 api 如下:
atomic_readatomic_add_return(i,v)atomic_add(i,v)atomic_inc(v)atomic_add_unless(v,a,u)atomic_inc_not_zero(v)atomic_sub_return(i,v)atomic_sub_and_test(i,v)atomic_sub(i,v)atomic_dec(v)atomic_cmpxchg(v,old,new)那么操作系统 (仅仅是软件而已) 是如何保证原子操作的呢?(还是得靠硬件),硬件原理是什么呢?
以上的那些 api 函数,在底层调用的其实都是如下__lse_atomic_add_return##name宏的封装,这段代码中最核心的也就是ldadd指令了,这是 armv8.1 增加的 lse(large system extension)feature。
(linux/arch/arm64/include/asm/atomic_lse.h)static inline int __lse_atomic_add_return##name(int i, atomic_t *v) { u32 tmp; asm volatile( __lse_preamble ldadd #mb %w[i], %w[tmp], %[v]n add %w[i], %w[i], %w[tmp] : [i] +r (i), [v] +q (v- >counter), [tmp] =&r (tmp) : r (v) : cl); return i; }那么系统如果没有 lse 扩展呢,即 armv8.0,其实现的原型如下所示,这段代码中最核心的也就是ldxr、stxr指令了
(linux/arch/arm64/include/asm/atomic_ll_sc.h)static inline void __ll_sc_atomic_##op(int i, atomic_t *v){ unsigned long tmp; int result; asm volatile(// atomic_ #op n __ll_sc_fallback( prfm pstl1strm, %2n 1: ldxr %w0, %2n #asm_op %w0, %w0, %w3n stxr %w1, %w0, %2n cbnz %w1, 1bn) : =&r (result), =&r (tmp), +q (v- >counter) : __stringify(constraint) r (i)); }那么在 armv8.0 之前呢,如 armv7 是怎样实现的?如下所示, 这段代码中最核心的也就是ldrex、strex指令了
(linux/arch/arm/include/asm/atomic.h)static inline void atomic_##op(int i, atomic_t *v) { unsigned long tmp; int result; prefetchw(&v- >counter); __asm__ __volatile__(@ atomic_ #op n 1: ldrex %0, [%3]n #asm_op %0, %0, %4n strex %1, %0, [%3]n teq %1, #0n bne 1b : =&r (result), =&r (tmp), +qo (v- >counter) : r (&v- >counter), ir (i) : cc); }总结:
在很早期,使用 arm 的 exclusive 机制来实现的原子操作,exclusive 相关的指令也就是ldrex、strex了,但在 armv8 后,exclusive 机制的指令发生了变化变成了ldxr、stxr。
但是又由于在一个大系统中,处理器是非常多的,竞争也激烈,使用独占的存储和加载指令可能要多次尝试才能成功,性能也就变得很差,在 armv8.1 为了解决该问题,增加了ldadd等相关的原子操作指令。

一文解析光模块的三种失效率预计方法
由先进***搬入上海投产谈直线电机在该领域的应用
面板需求不如预期,中国大陆厂商Q4减产是稳定价格关键
手机防水透声膜与防水透气膜的加工以及应用分析
基于System Generator实现高速盲均衡器设计并阐述了MCMA算法的实现过程
Linux Kernel(armv8-aarch64) 的原子操作的底层实现
三菱汽车公司在下一代电动汽车设计中采用ADI的低功耗隔离技术
同步发电机和电网并列应满足哪些条件
纺织印染污水处理中PLC远程监控如何实现?
关于MEMS加速度计工艺及材料的简单介绍
60w太阳能路灯设计方案汇总(四款模拟电路设计原理图详解)
电脑USB接口方案
长江存储投产64层堆栈3D闪存 将在年底提高产能到6万片
IBM的人工智能与人类辩论输了 这是迄今为止最具挑战性的竞争
HarmonyOS开发课表案例 你的智能课业管理工具
不同表面处理工艺的电路板与硅凝胶的匹配(下)
面临8国联军围堵 华为发表5G手机语音芯片
FPGA在步进电机控制中的应用
RS-422/RS-485的网络失效保护和瞬态保护
华为mate10什么时候上市?华为mate10紧急发布救场:全面屏+麒麟970,狙击iPhone8,华为mate10能否一鸣惊人?