历史上的今天
返回首页

历史上的今天

今天是:2025年02月02日(星期日)

2020年02月02日 | 原子操作--ARM架构

2020-02-02 来源:eefocus

说明:内核版本号为3.10.101


一、ARM架构中的原子操作实现


  在原子操作(一)中我们已经提到,各个架构组织为“复仇者”联盟,统一了基本的原子变量操作,这里我们就拿atomic_dec(v)来看看通天ARM的实现。


首先是atomic_dec(v)原子减一操作的宏定义。这个宏的定义在文件arch/arm/include/asm/atomic.h中:


#define atomic_dec(v)        atomic_sub(1, v)

  对于ARM架构不同的版本,stomic_sub(i,v)的实现是不一样的。具体而言,在ARMv6之前的版本定义如下:


#define atomic_sub(i, v)    (void) atomic_sub_return(i, v)

  而ARMv6以后的版本则将atomic_sub()实现为static 内联函数,具体见第二节。


二、ARMv6以前的版本的实现


  ARMv6之前的版本将atomic_sub()宏定义为atomic_sub_return()函数,其实现也在文件arch/arm/include/asm/atomic.h中。而这个atomic_sub_return()函数根据版本的不同也有两个不同的实现。我们这里只关注ARMv6之前版本的实现。


/* ARMv6 以前的版本:不支持SMP */

static inline int atomic_sub_return(int i, atomic_t *v)


{

    unsigned long flags;

    int val;

    raw_local_irq_save(flags); //关本地中断

    val = v->counter;

    v->counter = val -= i;

    raw_local_irq_restore(flags); //开中断

    return val;

}

 


  可以看到,对v->counter的减一操作是一个临界区,指令的执行不能被打断,内存的访问也需要保持没有干扰。


ARMv6以前的版本通过关本地中断来保护这块临界区,看起来相当简单,其奥秘就在于ARMv6以前的版本不支持SMP。


在系统不支持SMP的情况下,我们关掉本地中断可以防止下面几种意外:


  1) 关掉本地中断后,在对v->counter实施"减一"的过程中不会被外部中断打断;


  2) 系统不支持SMP,可以保证在本地cpu访问v->counter和val变量内存的过程中不会有其他cpu访问这些内存。


问题:


  1. 虽然在临界区内不会有其他cpu访问 v->counter和val,但是能够保证不会有DMA操作这些内存么?


  2. 虽然禁止了中断,但是可以保证期间此cpu不会被抢占或者因为其他原因放弃调度么?


答:


  1. DMA在操作内存前会通过DMA中断、总线仲裁来与cpu的内存访问进行协调。这里已经关掉本地中断,且是UP系统,所以不会干扰。


  2. 在UP系统中没有内核抢占;从代码上来看,临界区这一段没有主动放弃cpu;另外,我们禁止了本地中断,也就是禁止了时钟中断,这样在开中断前就不会有机会进行调度检查,保证临界区在开中断前一直运行。


三. ARMv7以后的架构


  从ARMv6T2以后的版本中,ARM和Thumb指令集开始采用了新一代"独占访问"指令"Load-Exclusive and Store-Exclusive "来实现原子操作。独占访问的秘诀就在于系统中通过exclusive monitor来实现独占访问的监控。内核中atomic_sub()的具体实现如下所示:



/*

 * ARMv6 UP and SMP safe atomic ops.  We use load exclusive and

 * store exclusive to ensure that these are atomic.  We may loop

 * to ensure that the update happens.

 */

static inline void atomic_sub(int i, atomic_t *v)

{

       unsigned long tmp;

       int result;

       __asm__ __volatile__("@ atomic_subn"              /* 优化屏障,防止编译器优化 */

"1:   ldrex       %0, [%3]n"                              /*【1】独占方式加载v->counter到result*/

"      sub  %0, %0, %4n"                                  /*【2】result减一*/

"      strex       %1, %0, [%3]n"                            /*【3】独占方式将result值写回v->counter*/

"      teq   %1, #0n"                                       /*【4】判断strex更新内存是否成*/

"      bne  1b"                                              /*【5】不成功跳转到1:*/

       : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)       /*输出部*/

       : "r" (&v->counter), "Ir" (i)                           /*输入部*/

       : "cc");                                                /*损坏部*/

}

 


  访存指令LDREX/STREX和普通的LDR/STR访存指令不一样,它是“独占”访存指令。这对指令访存过程由一个称作“exclusive monitor”的部件来监视是否可以进行独占访问。


  先看看这对独占访存指令:


  (1)LDREX R1 ,[R0] 指令是以独占的方式从R0所指的地址中取一个字存放到R0中;


  (2)STREX R2,R1,[R0] 指令是以独占的方式用R1来更新内存,如果独占访问条件允许,则更新成功并返回0到R2,否则失败返回1到R2。


  了解LDREX和STREX的基本原理后,理一理上面atomic_sub()原子更新(减一)atomic_t * v的实现流程:


  (1) 从内存中读取v->counter值到一个寄存器中(result),并更新exclusive monitor状态为独占访问;


  (2)result减一操作;


  (3)尝试将result的值写入v->counter地址,如果exclusive monitor允许独占写存,则修改内存成功并将tmp设置为0 ,否则tmp设置1;


  (4)查看tmp的值是否为0 ,如果不为0表示上面的更新v->counter失败,再次跳转会(1)执行。


  一旦STREX指令执行成功,就表示这次内存访问没有受到其他干扰,保证了内存更新操作的原子性。


推荐阅读

史海拾趣

Caddell-Burns Manufacturing公司的发展小趣事

为了进一步扩大市场份额,Caddell-Burns Manufacturing公司开始积极寻求国际合作。他们与多个国家的电子制造商建立了稳定的合作关系,将产品出口到世界各地。同时,公司还参加了多个国际电子展会,展示了公司的最新产品和技术成果,吸引了众多客户的关注。这些举措不仅提升了公司的国际知名度,也为公司的长期发展奠定了坚实基础。

Goldstar Electron Co Ltd公司的发展小趣事

随着环保意识的日益增强,Caddell-Burns Manufacturing公司也积极响应国家号召,致力于实现绿色发展。公司引进了先进的环保设备和技术,对生产过程中的废弃物进行无害化处理。同时,公司还研发了一系列环保型电子产品,满足了客户对绿色产品的需求。此外,公司还加强了对员工的环保教育,提高他们的环保意识,共同为保护环境贡献力量。

通过以上五个故事,我们可以看到Caddell-Burns Manufacturing公司在电子行业里发展起来的艰辛与辉煌。他们凭借过硬的技术实力、敏锐的市场洞察力和卓越的管理能力,在激烈的市场竞争中脱颖而出,成为一家备受瞩目的电子制造企业。

Eurotechnique公司的发展小趣事

在XXXX年,Eurotechnique迎来了一次重要的技术突破。公司成功研发出了一种新型的微控制器,具有更高的性能和更低的能耗。这一技术的突破不仅为公司带来了大量的订单,也进一步巩固了公司在微控制器领域的领先地位。随着技术的不断进步,Eurotechnique开始逐步扩展产品线,将业务范围拓展到数字信号处理、无线通信等多个领域。

品赞(G-Switch)公司的发展小趣事
检查控制回路中的接线是否正确,各元件是否损坏。
Cofan Usa Inc公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,Cofan Usa Inc公司开始积极拓展国内外市场。通过与各大电商平台和实体零售商建立合作关系,公司成功将产品推向更广泛的消费者群体。同时,公司注重品牌建设,通过精准的市场定位和有效的营销策略,逐渐树立了独特的品牌形象。

Cretex Companies Inc公司的发展小趣事

为了降低成本、提高生产效率,Cretex开始对产业链进行整合与优化。他们与上游供应商建立长期稳定的合作关系,确保原材料的稳定供应和质量可靠。同时,公司还加强了对下游客户的服务与支持,通过提供个性化的解决方案和优质的售后服务,增强了客户黏性。这些举措使得Cretex在激烈的市场竞争中保持了领先地位。

问答坊 | AI 解惑

PSPICE电子线路仿真详细资料!!

这个十分的精典.... 里面详细介绍了元件模型的建立...以及各电源模型的超详细介绍...最基础的东西... 是国内的ORCAD书中没有介绍的....…

查看全部问答>

单片机--“爱要怎么说出口”

小弟,最近恋上了单片机,后悔当初大学没有好好学,其实真正的学习还在于实践加自学, 各位过来人,能否将你们的学习经验分享分享?目前我只会一下51单片机,输入输出基本控制, 中断,定时器的应用。通信方面还欠缺,系统面就更不会了。还有单片 ...…

查看全部问答>

无线传感“电子尿布”减轻失禁病人的痛苦

很快全球的医院都可能开始采用一种电子*来监测和检测大小便失禁,并无线发送警报给护理人员。创羿科技讯国外某公司今年年初发布了一款电子*,据称在全球开创首例,可减少大小便失禁病人的痛苦,同时也提高老年人护理中心员工的效率,减少老年人护理 ...…

查看全部问答>

TMS320F240采用一个线性电阻测量三相电流

TMS320F240采用一个线性电阻测量三相电流…

查看全部问答>

《智能家居系统》

《智能家居系统》 愚以为《智能家居系统》应以简易型或全能型两种而这里说全能型也只能以一种框架形式推出,因作为学习和初次接触不可能投入大的资金或复杂的制作,而作为《智能家居系统》的发烧制作应用也是要求安全可靠并逐渐实现功能的全面, ...…

查看全部问答>

系统启动后 LCD黑屏

是2440+wince6.0,目前Driver目录下面就个Display驱动,从打印出的log看Display驱动已经初始化了,但是LCD是黑屏,就最下面有条白线,不知道是怎么回事,已经把POWER_SET那部分去掉了。 遇到这种情况的朋友请说一下。。。。。。…

查看全部问答>

wince 数据库安装问题

大家好:     我在台式机上面安装在wince 数据库SQL CE遇到了问题:     安装SQL SERVER CE2000(包含Adoce3.1)时候,提示我。下面的信息:the installation interrupted before Microsofe SQL Server Windows CE Edition c ...…

查看全部问答>

rp-pppoe移植问题

我现在是在PC机上交叉编译rp-pppoe-3.8.(mipsel-linux-gcc).但是很郁闷的是,下载下来的包里没有Makefile,只有configuer. ./configuer后生成不了Makefile。希望有谁能帮我解决,感激不尽! 我在编译内核时,把支持PPPOE的选项都选上了! 我的 ...…

查看全部问答>

表压、负压、绝压、静压的定义

本帖最后由 dontium 于 2015-1-23 13:33 编辑 表压、负压、绝压、静压的定义表压(CG)定义:流体的绝对静压与测量地点的大气压力值的差值。 1.总绝对压力超过周围大气压力之数。    2.液体中某一点高出大气压力的那部分压力。    3.以大气 ...…

查看全部问答>