2013-07-18 2 views
2

는 내가 86 어셈블리 코드가 있습니다x86에서 "잠금"을위한 arm assembly의 해당 접두사는 무엇입니까?

unsigned int oldval; 

__asm__ __volatile__ (
"movl $1, %0 \n" 
"lock xaddl %0, (%1) \n" 
: "=a" (oldval) : "b" (n))l; 

return oldval; 

을 나는 암 어셈블리로 번역하고 싶다. "잠금"과 동일한 작업을 수행하는 접두사가 있습니까?

+3

ARMv6 이상에는 ['LDREX' /'STREX'] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0008a/ch01s02s01.html)가 있으며, 다른 작업으로 인해로드와 저장소 사이에서 참조 된 메모리 위치가 수정되지 않을 때까지 읽기 - 업데이트 - 쓰기 사이클을 시도 할 수 있습니다. – Michael

+0

저는 그것을 실제 응답에 넣었습니다 - 이것이 가장 좋은 방법이라고 들립니다. –

+1

ARM에서 제공하는 일반적인 동기화 개념은 [load-linked/store-conditional]입니다 (http://en.wikipedia.org/wiki/Load-link/store-conditional). –

답변

4

내가 ARM 모르지만, 설명서를 통해 왜곡에서, 다음이 원자 교환 및-추가 대략한다 : 86에 달리

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" 

를,이 코드를 임의로 걸릴 수 있다는 것을 나타납니다 성공하기까지는 오랜 시간이 걸리지 만, 결국 이것이 성공할 것이라는 보장이 있는지 확실하지 않습니다.

그러나 조건부 저장소가 필요할 때 정확하게 성공할 것이므로 ARM 방식이 더 안전합니다. 반대로 x86 코드 (커널 스핀 록에서 가져온 것처럼 보입니다)는 *n에 하나를 추가하고 원래 *n이 0인지 테스트합니다. 충분한 스레드가이를 동시에 시도하면 잠금을 허용하지 않았더라도 *n이 오버플로되고 0이 될 수 있습니다.

+0

나는 개념이 일반적으로 CISC에서 RISC로 적용될 것이라고 생각한다. ** load-store ** 만있다. 'lock' 접두어는 직접 메모리 연산에서만 의미가 있습니다. 나는 PPC, MIPS, 등등 유사한 번역이있을 것이라는 점을 짐작할 것입니다. –

+0

@artlessnoise : 그들은 위의 내 의견에있는 링크를 참조하십시오. –

1

접두어 lock은 메모리 액세스에만 유용합니다. ARM은 메모리에서 산술 연산을 수행 할 수 없기 때문에 직접 연산을 수행하지 않습니다. ARM 코어의 충분한 버전을 사용중인 경우 동기화를 위해 dmb, dsbisb 명령어를 사용할 수 있습니다. 그렇지 않으면 뮤텍스가 필요합니다.

+0

감사합니다. 내 질문에 코드를 업데이트했습니다. 나는이 경우에 "잠금"을 없애면 오류가 발생할 것이라는 것을 전혀 모른다. ... – ballballbobo

관련 문제