ARM 에서 swp 연산이 없어지고 ldrex/strex 으로 대체된 이유

http://www.iamroot.org/xe/Kernel_10_ARM/182720 에서 8) LDREX, STREX에 대해서 다시 정리해보자. 부분

LDREX 와 STREX 에 대해 위의 링크에 잘 정리되어 있습니다.

제 나름대로 쉽게 간단히 이야기식으로 풀어보면, 예전의 swp 명령(지금은 deprecate 됨)은 bus 에 lock 을 걸어버리고 ldr, str 를 순차적으로 실행하는 방식이기 때문에, pipeline stall 등 성능 저하 요소가 발생합니다. 이를 회피하기 위해 ldrex 와 strex 명령이 사용되기 시작한 것이고, 이렇게 명령어를 2 번에 걸쳐 갈라서 사용하게 되니 당연히 atomic 연산을 위한 고려사항들이 생기게 됩니다.
즉, 다른 연산들과의 동시성을 고려해야 하고, 인터럽트나 context switching 등을 종합적으로 고려해야하는 복잡성이 생기게 됩니다.

한마디로 성능은 좋아질 수 있는데 동시성을 다루어야하는 난제가 생기는거죠.

그래서, 필요한 것이 exclusive monitor 인데 이는 단순히 tag memory 와 현재의 상태라는 정보밖에 없기 때문에, 당연히 다른 놈이 건드리고 지나갔는지 아닌지 여부이외의 다양한 정보는 알 수가 없습니다. State Machine 의 상태가 여러개로 정의되어 있고, 각 상태로 이동할 때의 Action 들이 다양하게 정의되어 있는 것이 아니라, 딱 2 개의 상태 밖에 없는 것입니다. “누가 건드리고 갔느냐 아니냐.” 이거죠.

이는 곧 예외 상황이나 자신이 원하지 않는 상황을 만났을 때의 대처 방법은 별도 어떤 복잡한 연산이 따로 있는게 아니고, “무조건 Clear 하고 다시 처음부터”의 정책이 될 수 밖에 없는 것입니다.

LDREX 와 STREX 명령어의 Syntax 는 다음과 같습니다.

LDREX{cond} Rt, [Rn {, #offset}]
STREX{cond} Rd, Rt, [Rn {, #offset}]

유심히 봐야할 것은 STREX 명령입니다. 레지스터가 Rd 와 Rt 2 개가 지정되어 있습니다.

Rt 는 저장할 값을 가지고 있는 일반 레지스터인데, Rd 는 Store 를 정상적으로 수행한 것에 대한 status 값을 리턴하는 레지스터입니다. 만약 다른 놈이 exclusive monitor 상태를 변경하였다면 Store 는 실패되고 Rd 값이 1 로 리턴됩니다.
References:
1. ARM Information Center
2. http://www.iamroot.org/xe/Kernel_10_ARM/182720

You may also like...