Memory Barrier

리눅스커널 2009. 10. 2. 12:12
 최근에는 명령 순서를 바꿔서 실행하는 CPU가 일반적이다. 이것은 연산 결과에 모순을 초래하지 않는 범위에서 실행 순서를 변경하고, CPU 자원 이용의 효율화를 목적으로 한다. 이 경우 단순히 그 CPU 전부가 연산 결과에 모순이 없는 것 뿐만 아니라, 다른 CPU에서 보았을 경우에도 연산 결과에 모순이 있으면 안 된다. 실제 메모리 상의 데이터는 다른 CPU로 부터 참조나 갱신을 하기 위해 CPU간의 동일한 데이터를 참조 할 때 그 데이터의 접근 순서를 제대로 지킬 필요가 있다. 이 메모리 접근 순서를 제어하기 위한 구조가 메모리 장벽(Memory Barrier)이다.
 메모리를 R,W,R,W,R,W 와 같은 순서로 참조되는 명령에서, CPU는 효율을 높이기 위해서 R,R,R,W,W,W 와 같이 명령을 재배치 할 수 있는데, 이러한 Re-Ordering 를 막기 위해 Memory Barrier 를 사용한다.

#if __LINUX_ARM_ARCH__ >= 7
#define dmb() __asm__ __volatile__ ("dmb" : : : "memory")
#elif defined(CONFIG_CPU_XSC3) || __LINUX_ARM_ARCH__ == 6
#define dmb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \
                    : : "r" (0) : "memory")
#else
#define dmb() __asm__ __volatile__ ("" : : : "memory")
#endif
Posted by blee
,