我有一个 x86 汇编代码:
unsigned int oldval;
__asm__ __volatile__ (
"movl $1, %0 \n"
"lock xaddl %0, (%1) \n"
: "=a" (oldval) : "b" (n))l;
return oldval;
我想把它翻译成手臂组件。手臂组件中是否有任何前缀与此处的“锁定”功能相同?
我不了解 ARM,但是从对手册的掩饰来看,以下内容应该近似于您的原子交换和添加:
foo:
LDREX R1, [R0] ; R0 is "n", load linked
ADD R2, R1, 1 ; R2 = R1 + 1
STREX R3, R2, [R0] ; store conditionally, R3 = 0 if and only if success
CBNZ R3, foo ; on failure, try again
;; now return R1 to "oldval"
与 x86 不同,这段代码似乎需要任意长时间才能成功,但我不确定是否有任何保证最终会成功。
但是,请注意 ARM 方法更安全,因为条件存储会在它应该成功的时候准确地成功。相比之下,您的 x86 代码(看起来像是取自内核自旋锁?)只是*n
加一并测试原始代码*n
是否为零。如果有足够多的线程同时尝试此操作,则*n
即使您未被允许获取锁,也可能会溢出并为零。
lock
前缀仅对内存访问有用。由于ARM不能对内存进行算术运算,所以没有直接对应的操作。如果您使用的是足够高的 ARM 内核版本,则可以使用dmb
、dsb
和isb
指令进行同步。否则,您将需要某种互斥锁。