[의미] Memory Barrier

맥주 2007.12.17 19:06 조회 수 : 7890 추천:63

최근 CPU들은 일련의 명령어들은 실행 순서를 변경하여, 자원을 효율적으로 사용하도록 하는 기능들을 지원한다고 합니다. 실행 순서의 변경은 모순된 결과를 초래하지 않는 범위 내에서 변경되도록 하는 것은 당연합니다. 이 경우 단순히 그 CPU 에서의 연산 결과에 모순이 없을 뿐만 아니라 다른 CPU에서 보았을 경우에도 연산 결과에 모순이 있으면 안됩니다. 실제 메모리 상의 데이터는 다른 CPU로 부터 참조나 갱신을 하기 위해 CPU간의 동일한 데이터를 참조 할 때 그 데이터의 접근 순서를 제대로 지킬 필요가 있습니다. 이 메모리 접근 순서를 제어하기 위한 구조가 메모리 장벽-Memory Barrier 입니다. 예를 들어 메모리를 R,W,R,W,R,W 와 같은 순서로 참조되는 명령에서, CPU는 효율을 높이기 위해서, R,R,R,W,W,W 와 같이 명령을 재 배치 할 수 있는데, 이러한 Re-Ordering 를 막기 위해 Memory Barrier 를 사용합니다.
그리고, Memorry 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

arm V7 에는 새로운 명령 "dmb" 가 생겼나 봅니다. V6 에서는 저희가 보던 데이터 시트의 내용과 비슷한 코프로세서 명령을 사용합니다. 이는 하드웨어적인 방법인가 봅니다. 그리고 ("" : : : "memory") 은 소프트웨어적인 방법이라고 생각되는데요.

참.. 그리고 인라인 어셈블리에서 "cc" 는 condition 플래그가 변경된다는 것을 나타내는군요..
번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2197
1585 Linux Device Model [2] file 김민호 2011.05.22 8459
1584 system_call 의 swapgs 인스트럭션에 대하여 [2] 지현구 2007.09.16 8438
1583 fork()와 vfork()의 차이점과 COW(Copy On Write) [1] 아폴로 2013.05.02 8340
1582 스핀락에 대한 나름대로의 정리와 3가지 질문.. [19] 이종인 2011.04.25 8335
1581 이번주 논의 사항 [2] 남현우 2008.05.10 8202
1580 죄송합니다. [1] 송형주 2008.05.13 8106
1579 스터디 장소 예약 했습니다. [13] 장병남 2010.04.05 8067
1578 [투표]이번주 모임 장소 투표해주세요. [15] 나영찬 2010.04.05 8014
1577 init_task의 thread info의 cpu값 설정. [8] 유경환 2011.10.21 8010
1576 ARM TCM Tightly Couple Memory a 2010.04.10 7954
1575 어제 sched_init()을 끝냈습니다. [1] 윤석훈 2010.08.22 7921
» [의미] Memory Barrier [10] 맥주 2007.12.17 7890
1573 ARMv8 아키텍쳐 관련 읽을거리 [3] K 2013.05.06 7829
1572 namespace file 유강희 2011.06.10 7824
1571 어제는 모두 잘 들어가셨나요'ㅅ' ㅎㅎㅎ [3] file 조은지 2010.04.11 7710
1570 2012.4.14 스터디 [6] 이한울 2012.04.14 7695
1569 smdk2440보드 회로도. [3] 김희근 2008.12.17 7690
1568 4/3 ARM C Study group 회의 내용 [10] file 강효민 2010.04.03 7670
1567 이제 start_kernel()에 함수가 38개밖에 안남았네요.. [4] 윤석훈 2010.11.30 7634
1566 리눅스 커널 심층분석 (4장 ~9장) 요약부분 [1] file 박재성 2011.06.03 7631
XE Login