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 コード (カーネル スピン ロックから取得したように見えますか?) は、1 を に追加し、元がゼロ*n
かどうかをテストします。*n
十分な数のスレッドが同時にこれを試行すると*n
、ロックの取得が許可されていなくても、オーバーフローしてゼロになる可能性があります。