2012-02-20 4 views
0

gcc 크로스 컴파일러는 Built-in functions for atomic memory access을 지원하지 않습니다. 어떻게 내가 스팍 V8 아키텍처를위한 인라인 어셈블리를 사용하여, 다음과 같은 기능을 구현할 수 있습니다Sparc V8 용 비교 및 ​​스왑 기능의 구현 인라인 어셈블리

long __sync_val_compare_and_swap (long *ptr, long oldval long newval) 
{ 
.... 
} 

그 내장은 원자 비교 및 ​​스왑 수행합니다. 즉, * ptr의 현재 값이 oldval이면 newval을 * ptr에 씁니다.

+0

http://stackoverflow.com/questions/9276946/gcc-inline-assembly-for-sparc-architecture/9280379#9280379 –

+0

test_cas.c :(텍스트 + 0x70) –

+1

링킹 'atomic_cas_8'로 정의 참조 솔라리스 libc가 필요합니다 ... 아니면, http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/common/atomic/sparc/atomic.s에서 소스를 가져 와서 얻으십시오. . –

답변

2

SPARC V8에는 CAS 명령이 없으므로 어떻게 든 에뮬레이션해야합니다. 예 : http://www.oracle.com/technetwork/server-storage/solaris10/index-142944.html에서 CAS와 같은 C 유사 의사 코드를 사용하고 원자 {} 영역의 원 자성을 보장하기 위해 정적 pthread 뮤텍스를 사용하십시오. .

+1

뮤텍스가 충분하지 않습니다. 그것은 재진입 성을 제공하지 않으므로 모든 신호를 차단 및 차단 해제하려면 CAS 당 두 개의 시스템 호출이 필요합니다. 더 나은 해결책은 중단되지 않은 경우 오버 헤드없이 커널 지원 CAS를 사용하도록 ARM이 고정 된 것과 동일한 방법으로 커널을 수정하는 것입니다. http://lwn.net/Articles/314561/ SMP에서 작동하지만 원자 CAS를 제공 할 수없는 시스템에서 SMP를 사용하려는 경우에는 좋은 생각이 아닙니다. –

+0

@R .. : 맞습니다. 원자 기본 요소를 모방하면 비용이 많이 드는 것으로 나타납니다. 당신이 모든 경우를 돌보고 싶다면 .. :) FWIW, SPARC V8은 ldstub와 스왑 원자 명령어를 가지고 있습니다. 간단한 스핀 록 (spinlock)이나 비슷한 것을 구현하기에 충분하지만, AFAICS는 CAS의 간단한 구현을 허용하기에 충분하지 않습니다. 용어. – janneb

+0

특정 pthread 프리미티브 (특히 세마포어)를 준수하는 구현에서는 원자 CAS가 필요합니다. 그렇지 않으면 모든 작업 (커널이 인터럽트가 비활성화 된 시스템 콜에서 CAS를 완전히 에뮬레이션 함)을 수행하지 않아도 커널 조정 없이는 해결할 수없는 자체 동기화 된 파괴 문제가 발생합니다. 원자 교환으로는 충분하지 않습니다. –

관련 문제