作者septemhill (冰淇淋乾杯)
看板C_and_CPP
標題[問題] atomic 運算
時間Sun Dec 26 21:54:48 2010
最近在用pthread之間溝通問題的時候,會用到一些atomic的function
像是__sync_add_and_fetch 或是 __sync_lock_test_and_set之類的
而我實際去gcc底下翻出他底層的code implement如下:
static inline long
__kernel_cmpxchg (int oldval, int newval, int *mem)
{
register unsigned long lws_mem asm("r26") = (unsigned long) (mem);
register long lws_ret asm("r28");
register long lws_errno asm("r21");
register int lws_old asm("r25") = oldval;
register int lws_new asm("r24") = newval;
asm volatile ( "ble 0xb0(%%sr2, %%r0) \n\t"
"ldi %5, %%r20 \n\t"
: "=r" (lws_ret), "=r" (lws_errno), "=r" (lws_mem),
"=r" (lws_old), "=r" (lws_new)
: "i" (LWS_CAS), "2" (lws_mem), "3" (lws_old), "4" (lws_new)
: "r1", "r20", "r22", "r23", "r29", "r31", "memory"
);
if (__builtin_expect (lws_errno == -EFAULT || lws_errno == -ENOSYS, 0))
ABORT_INSTRUCTION;
/* If the kernel LWS call succeeded (lws_errno == 0), lws_ret contains
the old value from memory. If this value is equal to OLDVAL, the
new value was written to memory. If not, return -EBUSY. */
if (!lws_errno && lws_ret != oldval)
lws_errno = -EBUSY;
return lws_errno;
}
是一段用inline asm寫成的function,我是看得懂code的內容
可是我看不出來他是如何作到atomic的部份,是volatile的關係嗎?
volatile的意思是說不要對這段code做任何最佳化,以及移動的動作
可是我不知道他是否具有atomic的功能
還請各位解惑一下,謝謝
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.118.9.54
※ 編輯: septemhill 來自: 122.118.9.54 (12/26 21:56)
推 LPH66:你是在問 x86 還是? 因為這看起來像 arm... 12/26 22:07
→ septemhill:這是linux上的code,x86的 12/26 22:09
→ septemhill:我是在gcc-4.5底下找到這段code的 12/26 22:10
→ WPC001:arm +1 12/26 23:27
→ akasan:arm 只有到 r15 阿XD 12/26 23:48
→ akasan:喔對了 在這邊 volatile 是告訴 compiler 這段 code 12/26 23:48
→ akasan:有動到記憶體內容 12/26 23:48
推 softwind:5.44 Built-in functions for atomic memory access 12/27 00:02
→ purincess:只好google了一下原po地code發現那是PA-RISC用的 12/27 01:37
→ purincess:整段code看下來是一個滿標準的test & set implementatio 12/27 01:38
→ purincess:註解好像也有說為什麼不需要/沒有ISA提供的test-and-set 12/27 01:39
→ septemhill:有動到memory這個部份,是因為第三個optional的原因 12/27 10:10
→ septemhill:這個部份我明白了,所以說這是他造成atomic的主因嗎? 12/27 10:11
→ septemhill:因為我對第三個optional的理解只有說,在此段asm中 12/27 10:11
→ septemhill:會動到的register、memory,讓其他程式不要存取而已 12/27 10:12
→ septemhill:因此並不是很明白是否還有其他的用途 12/27 10:12
→ cltang:從comments,加上"ble 0xb0(%sr2,%r0)"這樣的asm看來 12/27 17:56
→ cltang:PA跟ARM一樣,是使用kernel helper來做到atomic exchange的 12/27 17:57
→ cltang:這個linux-atomic.c裡的__kernel_cmpxchg只是個 12/27 17:58
→ cltang:fast syscall的wrapper, "LWS"跟PA google一下, 就是 12/27 17:59
→ cltang:"Light-Weight Syscall"的縮寫, 只是啟動方式跟ARM略有不同 12/27 18:00
→ cltang:也就說你要看的atomics的implementation,要去追kernel src 12/27 18:01
→ cltang:不過可能到kernel裡也是有特殊指令完成它,可能看到的也不多 12/27 18:02