您的位置 首页 分销

x86和arm架构原子操作的差异

x86和arm在原子操作上有些差别,下面一代码的形式来说明区别:首先比较单核:由于x86是CISC指令集,允许在一条指令里进行两次内存…

x86arm原子操作上有些不同,下面一代码的方式来阐明差异:

首要比较单核:
因为x86是CISC指令集,答应在一条指令里进行两次内存操作,所以对i++,i__这些操作在单核条件下是原子,当然必须得是显现运用addl r,%1这种,就可在一条指令里完结读,写操作。
而arm归于RISC指令集,在一次指令履行期间只能有一次内存操作,所以像i++,i–这些需求先读取内存值然后赋值的操作,在arm架构下无法一条指令完结,所以就不满意原子操作,这时怎样完成原子操作呢:
咱们经过代码来看;
关于atomic_add
x86的完成很简单:

static__inline__voidatomic_add(inti,atomic_t*v)
{
__asm____volatile__(
LOCK”addl %1,%0″
:”=m”(v->counter)
:”ir”(i),”m”(v->counter));
}

单核状况下LOCK是空。
下面再看下atomic_add_and_test:

static__inline__inthal_atomic_add_and_test(inti,emcos_atomic_t*v)
{
unsignedcharc;

__asm____volatile__(
LOCK”addl %2,%0; sete %1″
:”=m”(v->val),”=qm”(c)
:”ir”(i),”m”(v->val):”memory”);
returnc;
}

或许咱们会想,这个有两条指令了,能是原子的吗?肯定是,为什么是呢?
咱们要注意sete %1这个是条件指令,而这个条件(cflags)是进程相关的,即便当进程履行完add1 %2,%0,这时产生中止,切换到别的一个进程,当回来的时分cflags仍是进程的,和没切换的景象相同,所以是原子。
而关于arm这需求更多作业:

#defineatomic_add(i,v)(void)atomic_add_return(i,v)

staticinlineintatomic_add_return(inti,atomic_t*v)
{
unsignedlongflags;
intval;

local_irq_save(flags);
val=v->counter;
v->counter=val+=i;
local_irq_restore(flags);

returnval;
}

上面能够看出是经过关中止来完成的,为什么要关中止来完成原子操作:
剖析下:
arm关于i++会生成如下代码:
1ldr r0,=i
2mov [r0],r1 //这个读内存操作
3inc r1 //假如在这个时分产生中止,然后在中止处理程序中也履行i++操作就不是原子操作
4mov r1,[r0]//这个写内存操作
假定I=0。假如进程1履行i++,履行到3时被中止打断,然后中止中也履行了i++,当两个i++履行完了,i=1,而不是咱们所要的2,这就对错原子操作的成果。
怎样处理,便是说2-4这段代码要么不履行,要么履行完才干确保原子,这个在单核上经过关中止就能够完成,这也是上面关中止的原因。

2.多核状况;
x86架构下:
单指令也不是原子操作了,比方addl r,%1这种有两次内存操作的也不是原子操作,有或许在履行下一次内存操作的时分,另一个中心也读取了这个内存,也会形成两次i++操作为1的过错成果。
处理方法是家LOCK标识,这个标识的作用是在一条指令履行时,锁住总线,其他中心无法读取,然后得到了原子操作。
arm架构下:
arm只要v6系列后的才有多核,也才有专门的内存原子操作机制便是ldrex,strex指令。
其源码如下:

staticinlineintatomic_add_return(inti,atomic_t*v)
{
unsignedlongtmp;
intresult;

__asm____volatile__(“@ atomic_add_return\n”
“1: ldrex %0, [%2]\n”
” add %0, %0, %3\n”
” strex %1, %0, [%2]\n”
” teq %1, #0\n”
” bne 1b”
:”=&r”(result),”=&r”(tmp)
:”r”(&v->counter),”Ir”(i)
:”cc”);

returnresult;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/277006.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部