Linux Kernel 의 Memory barrier 구현

Linux Kernel의 프로세스 상태 변경 매크로(set_task_state, set_current_state)를 살펴보다가 ARM 아키텍처에서 다음과 같이 구현된 것을 보았다.

include/linux/sched.h

#define set_task_state(tsk, state_value)        \
    set_mb((tsk)->state, (state_value))
#define set_current_state(state_value)        \
    set_mb(current->state, (state_value))

set_mb 매크로는 시스템마다 다르게 구현되어 있는데 ARM 쪽을 따라가보면 다음과 같이 쓰여져 있다.

arch/arm/include/asm/system.h

#define dmb() __asm__ __volatile__ (“” : : : “memory”)

#define smp_mb()    dmb()

#define set_mb(var, value)    do { var = value; smp_mb(); } while (0)

do-while-0 구문에 대해서는 이 글을 참고하도록 하고, memory barrier에 대해서는 이 글을 참고하라. dmb() 의 inline assembly의 구조와 설명은 이 글을 참고하자.

참고된 글을 정리하자면, 명령이 R, W, R, W, R, W 순으로 사용된다면, 이를 하드웨어 혹은 소프트웨어 적으로 R, R, R, W, W, W 순으로 배열하는 등의 최적화를 할 수 있는데, 이 때 명령의 순서를 보장해 주는 역할로써 Memory barrier 라는 것을 구현해서 사용한다. 이는 하드웨어적으로 혹은 소프트웨어적으로 구현되는데 하드웨어적인 방법은 CPU 자체의 명령으로 구현되는 등의 방법이 사용될 수 있고, 소프트웨어적으로 구현될 때 위와 같이 구현될 수 있다.
위 구문은 gcc inline assembly의 확장으로 clobber list에 “memory”를 적어넣어 해당 명령(“” – 아무 명령도 수행하지 않음)을 수행한 후에 변경되는 것이 메모리 타입 저장장치(모든 레지스터, 모든 플래그, 모든 메모리)임을 나타낸다. gcc는 이럴경우 __asm__ __volatile__(“”: : :”memory”) 경계를 넘어가는 최적화 또는 instruction scheduling을 수행하지 않기 때문에 __asm__ __volatile__(“”: : :”memory”)를 사용하면 이전 코드의 수행 완료를 보장할 수 있고 이후 코드가 __asm__ __volatile__(“”: : :”memory”) 이전에 수행되는것을 방지 할수 있다. 별개로 volatile의 경우 읽기 연산에서 메모리에서 한번 읽어온 데이터를 레지스터에 저장해서 사용하는 것이 아닌 사용할 때마다 메모리 참조를 통해 가져오도록 한다.

매크로에서 do { … } while(0) 을 사용하는 이유

리눅스 커널 소스를 살펴보다가 헤더쪽의 매크로에서 “do { … } while(0)” 와 같은 것이 많이 쓰인 것을 보았다.
당연히 { … } 이 한번만 실행되고 끝나는 건데, 왜 이렇게 했을까 궁금해서 찾아보았다.

정리하자면,

1. 빈 문장(“;”)은 컴파일러에서 Warning 을 발생시키므로 이를 방지!
2. 지역변수를 할당할 수 있는 Basic block 을 쓸 수 있다.
3. 조건문에서 복잡한 문장을 사용할 수 있다. 예를 들면 다음과 같은 코드가 있다고 했을 때,

#define FOO(x) \
        printf(“arg is %s\n”, x); \
        do_something_useful(x);

다음과 같이 이 매크로를 사용한다면,

if (blah == 2)
        FOO(blah);

이렇게 해석되어서 쓰여진다.

if (blah == 2)
        printf(“arg is %s\n”, blah);
        do_something_useful(blah);;

뭐가 문제냐고? do_something_useful(blah); 는 조건에 관계없이 수행된다. 이는 원하는 결과가 아니다. 하지만 do { … } while(0) 를 쓴다면 다음과 같이 해석될 것이다.

if (blah == 2)
        do {
                printf(“arg is %s\n”, blah);
                do_something_useful(blah);
        } while (0);

정확히 원하는 결과를 얻을 수 있다.

4. 3번과 같은 경우에 다음과 같이 사용할 수도 있지 않냐고 생각할 수 있다.

#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

그러나 다음과 같은 경우에는 원하는데로 동작하지 않는다.

if (x > y)
        exch(x,y);          // Branch 1
else 
        do_something();     // Branch 2

왜냐하면 다음과 같이 해석되기 때문이다.

if (x > y) {                // Single-branch if-statement!!!
        int tmp;            // The one and only branch consists
        tmp = x;            // of the block.
        x = y;
        y = tmp;
}
;                           // empty statement
else                        // ERROR!!! “parse error before else”
        do_something();

do { … } while(0) 를 사용하면 다음과 같이 해석되어 원하는 의도대로 정확히 쓸 수 있다.

if (x > y)
        do {
                int tmp;
                tmp = x;
                x = y;
                y = tmp;
        } while(0);
else
        do_something();

5. gcc에서는 Statements and Declarations in Expressions 확장을 사용할 수 있다. 이는 위에서 본 do-while-0 Block 대신 쓸 수 있다.

참고 :    KLDP의 “의미없는 do while 문

kernelnewbies.org의 “FAQ/DoWhile0

ARM CPU Now & Future(2008.11.25) 정리

ARM CPU Now & Future 라는 제목의 무료 동영상이 있길래 한번 보았는데 여러가지 주목할만한-내 주관적으로- 이야기가 있길래 정리한다. 자료 자체는 2008년 11월 25일 자료이므로 현재(2009.9.24) 상황과 비교해서 보는 것도 좋을 듯 하다.
강연 때 사용한 PPT 역시 구글에서 찾을 수 있길래 첨부(링크)한다.
cfile3.uf.1371A41C4ABAD361094B2C.pdf


1. 멀티 코어 관련 개발 기술 필수

일단 ARM 을 버전별로 나누어 정리한 표는 다음과 같다.

출처 : ARM CPU – Now and Future, Sanghi(Sky) Lim ARM Korea


ARMv4, v5, v6, v7 별로 어떤 코어가 사용되고 있는지 눈여겨 봐두자. ARM11-MPCore와 Cortex-A9 위에 화살표에 적힌 x1~4는 멀티코어 개수를 나타내는데, 반도체 회사에서 마음대로 최대 4개까지 코어 개수를 조정할 수 있다고 한다. 앞으로 나올 프로세서들에는 기본적으로 MPCore 기술이 들어간다고 하니 멀티코어 관련 개발 기술은 임베디드 개발하에서도 필수적인 기술이 될 듯 하니, 꼭 익혀둘 필요가 있다.
저가형을 대체하고자 하는 Cortex-M3와 Cortex-M1은 안의 FPGA 에 자체 개발한 IP를 탑재하여 시스템에 적용할 수 있다고 한다.

2. 파트너십에 의한 웹 접근성 강화

출처 : ARM CPU – Now and Future, Sanghi(Sky) Lim ARM Korea


웹 접근성 향상을 위해서 다양한 소프트웨어 회사들과의 작업중이라고 한다.

1. Adobe Flash player : 자료상으로 2009년 상반기 내에 Adobe Flash player 10가 ARM 기반(ARM v6, ARM v7)으로 출시 될 것이라고 이야기하고 있다.
2. Google Chrome : Google의 웹브라우저인 Chrome 은 PC와 ARM 을 동시에 지원하고 있다고 한다.
3. MS Silverlight & Media codecs : MS 윈도우즈 모바일의 실버라이트 역시 ARM 을 지원하도록 작업중이라고 한다. MS에서 미디어 코덱 역시 ARM을 위해 내어놓고 있다고 하니 멀티미디어 지원에 있어서도 강점을 갖게 될 것이다.
4. Firefox : Firefox 를 ARM CPU에 대해 최적화 작업을 해서 6배 빨라졌다고 한다. 또한, 이에 관현한 작업물들을 오픈소스로 공개하여 ARM 사이트에 가면 공개된 자료를 받아볼 수 있다고 한다. x86 기반의 소스와 비교하면 어떤 최적화 기법을 썼는지 볼 수 있으므로 도움이 되지 않을까?
5. Ubuntu : Canonical 에서 우분투 데스크탑을 ARM v7에서 사용하도록 지원한다고 한다. 단순히 커널 뿐 아니라 오픈 오피스 등의 프로그램 등도 지원한다고 한다. 우분투 기반의 많은 디바이스들이 나올 듯 하다.

위에서 보는 바와 같이 ARM은 임베디드 기기의 Major OS인 윈도우즈, 리눅스를 모두 효과적으로 운영할 수 있도록 지원하고, 플랫폼에 독립적인 웹 환경과 멀티미디어 분야 역시 지원하고 있다. 이를 보면 이미 예측된 바와 같이 무선 환경하의 ARM 기반 디바이스들에 사용될 소프트웨어 및 서비스 시장이 매우 커질 것을 예상할 수 있겠다.

저작권과 번역물에 관련된 권리

영문 자료 중에 공부하고 싶거나 정리를 하고 싶을 때 나는 문장을 번역하면서 어디에 올려둔다. 시간이 오래 걸리기는 하지만 문장을 곱씹어 볼 수 있고 나중에 찾아볼 때도 번역된 내용물을 보는게 편하기 때문-역시 아직은 영문보다 국문이 편하다-이다. 올릴 때도 내가 어디에 있든 볼 수 있도록 대개 인터넷 어딘가-예를 들면 블로그-에 올려두는데 블로그에 올릴 때 항상 신경이 쓰이는 것이 저작권에 관련된 문제이다. 블로그 상에 어떤 정보를 올리는 것은 공공에 대한 배포 행위로 간주되기 때문이다. 내 블로그의 Reading 카테고리가 그냥 보면 모두 글 수가 0인 이유가 바로 여기에 있다. ㅋㅋ

오늘도 구글 안드로이드 관련 문서를 보다가 이 걸 번역해서 어디다 올려? 라는 생각으로 접근하다가 라이센스에 대한 내용을 한번쯤은 알고 넘어가야겠다는 생각에 여기저기 뒤적거리던 것들을 정리해두고자 한다.

먼저 번역물을 작성하는 것은 원저작물에 대한 저작권 침해의 여부가 있는지에 대해 알아야 하는데 간단하게 대답은 “예”이다. 원저자와 협의되지 않은 번역물은 원저작물에 대한 2차적 저작물의 작성권을 침해할 우려가 다분히 있다. 다만 이에 대해서도 예외가 존재하는데 이는 저작권법(일부개정 2009.4.22 법률 제9625호)의 “제2관 저작재산권의 제한”의 “제36조(번역 등에 의한 이용)”에서 기술된 바와 같다. 풀어서 쓰면 다음과 같다.

1. “학교교육 목적 등에의 이용(제25조)”, “영리를 목적으로 하지 아니하는 공연,방송(제29조)”, “사적이용을 위한 복제(제30조)” 의 경우에는 각 조항의 규정에 따라 번역, 편곡, 개작하여 이용할 수 있다.
2. “재판절차 등에서의 복제(제23조)”, “정치적 연설 등의 이용(제24조)”, “시사보도를 위한 이용(제26조)”, “시사적인 기사 및 논설의 복제 등(제27조)”, “공표된 저작물의 인용(제28조)”, “시험문제로서의 복제(제32조)”, “시각장애인 등을 위한 복제 등(제33조)” 의 경우에는 각 조항의 규정에 따라 번역하여 이용할 수 있다.

내가 이용하는 목적은 “사적이용을 위한 복제”에 해당하므로, 나는 번역해서 혼자만 보면 된다. ㅋㅋ
그렇지 않은 경우에는 번역권이라는 권리를 받아야 하는데 원저자의 일종의 허락과 같은 것으로 보면 될 듯 하다.

따라서 인터넷 상에 번역된 정보를 올리기 위해서는 원저작권자로부터 번역권과 배포권을 얻어야 하는 것으로 정리하면 될 듯 하다.

그리고, 번역권을 얻어 번역한 저작물에 대해서는 2차적 저작물로 취급되므로 독자적인 저작물로서 보호된다. 이에 대해서는 저작권법 “5조(2차적 저작물)”을 참고하면 된다.

처음엔 쉽게쉽게 쓰려고 했는데, 법률 등을 참고하다보니 글이 어려워보인다;;

구글 안드로이드 문서의 Content License

구글 안드로이드 관련 문서들을 살펴보다가 괜찮은 문서가 있으면 공부 및 정리 겸 해서 번역하면서 보려고 생각하다가 그냥 번역하고 인터넷 상에 올리면 안될 것 같아서 문서들 아래에 적혀있는 다음과 같은 문구의 링크된 Content License 부분을 눌러서 보게 되었다.


Android 1.5 r3 – 21 Jul 2009 11:19



일단 Content에 대해서 두가지로 나누고 있는데, 먼저, “Documentation content” 라 하여 “Dev Guide” 와 “Reference” 탭에 있는 샘플 코드나 소스코드로 부터 생성된 내용이나 그 외 내용들로 하나를 구분하고, 기타 다른 사이트 상의 모든 내용들, 이렇게 해서 두가지로 구분한다.

Content License 에 따르면, 일단 “Documentaion content”는 Android Open Source Project의 일부로 사용 가능하고, 어떤 코드가 포함된 문서들은 Apache 2.0 라이센스를 따른다고 한다. 물론 그에 앞서 GPLv2나 그 외의 라이센스에 해당하는 소스코드를 포함하는 경우에는 해당 라이센스가 우선된다. Apache 2.0 License에 관해서는 KLDPWiki: 오픈소스 소프트웨어 라이센스 가이드Apache 2.0 라이센스 원문, 그리고 Apache 2.0 라이센스의 번역본(김윤수님의 Apache License Version 2.0 번역 완료) 글을 참조해보기 바란다.

그리고 나머지 사이트 상의 다른 모든 자료들은 Creative Commons Attribution 2.5[우리말] 라이센스를 따른다.

[PPT] 파워포인트 동영상 삽입 시 동영상이 안나올 경우

파워포인트 문서를 작성할 시에 동영상을 삽입해서 나오게 하는 경우가 많다.

그런데 이럴 때 동영상 재생이 제대로 되지 않는다면 큰 문제!

문제의 원인은 소리만 나거나 영상만 나온다면 코덱 문제일 수도 있고, 하드웨어 가속이 문제인 경우도 있다.

하드웨어 가속인 경우에는 당연히 하드웨어 가속을 없애주면 된다.

바탕화면에서 우클릭 / “속성(P)” / “설정” 탭 선택 / “고급” 버튼 클릭 / “문제 해결” 탭 선택 후 다음과 같이 “최대”로 되어있는 하드웨어 가속을 없애준다.


그리고 재생해보자! 잘 나오나? ㅎㅎ

참고 : ppt에서 동영상 재생안되는 경우

온다 리쿠

http://news.khan.co.kr/section/khan_art_view.html?mode=view&artid=200908041801291&code=900315

생각없이 네이버에 들어갔다가 메인에 떠있던 온다 리쿠 라는 글자를 보고 눌렀던 글.
이 작가의 이야기를 풀어나가는 솜씨는 대단하다. 일본 작가이니 역자 역시 대단하다. 글의 중반부까지 이끌어 나가는 솜씨는 정말 혀를 내두를 정도.. 읽다보면 나도 모르는 기대감이 무럭무럭 자라난다. 그 기대감에 걸맞는 마무리까지는 무리일지는 몰라도.. ㅎㅎ

꽤 좋아하는 작가로 저 글에 나온 “밤의 피크닉”, “호텔 정원에서 생긴 일”, “삼월은 붉은 구렁을” 등을 읽었다. “삼월은 붉은 구렁을”은 정말 책을 좋아하는 사람이라면 꽤나 흥미로워할만한 하다. 저 책을 읽다가 “흑과 다의 환상”을 집어 읽다 만게 생각난다. 나중에 찾아 읽어야지..

굳이 저 글의 링크를 남겨두는 이유? 본문에 못 읽어본 책들 제목이 나와서.. ㅎㅎㅎ

“지식의 단련법” 이라는 책을 보면 저자는 자신의 독서에는 두가지 목적이 있다고 하던데, 하나는 입력(독서)을 출력(글쓰기)을 위해 읽는 것이고, 다른 하나는 입력 자체가 즐거워서 하는 경우라고 하더라.
요즘 내 독서의 많은 부분은 후자의 경우가 많다. ㅎㅎㅎ!

Windows 탐색기에서 원하는 폴더에서 시작하는 명령 프롬프트 열기

  1. 레지스트리 편집기 열기(“프로그램” / “실행” / regedit)
  2. HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell 에서 “shell” 에 대고 마우스 우클릭 후 “새로 만들기(N)” / “키(K)”
  3. “CmdHere” 같은 식으로 넣기
  4. 만들어진 “CmdHere” 을 누르고 오른쪽 창 기본값에 “명령 프롬프트(&Y)” 를 입력
  5. 만들어진 “CmdHere”에서 마우스 우클릭 후 “새로 만들기(N)” / “키(K)”
  6. “command” 입력
  7. 만들어진 “command” 를 누르고 오른쪽 창 기본값에 다음 입력
cmd.exe /d cd \”%1″


8. 탐색기에서 폴더에 대고 우클릭하면 “명령 프롬프트(Y)” 가 나타남.

HKEY_CLASSES_ROOT/Directory/Background/shell 아래도 동일하게 넣는다.