[완료] io.h의 __raw_readl을 어떻게 이해할지 알려주시면 감사하겠습니다.
글쓴이: snowavalanch / 작성시간: 금, 2011/11/25 - 9:01오후
매크로 해석이 어렵네요...
아래와 같이 사용되는데, 해석이 안되네요.
__raw_readl(mcpdm->io_base + reg);
#define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a))
# define __chk_io_ptr(x) (void)0
어떻게 이해할지 알려주시면 감사하겠습니다.
Forums:
__chk_io_ptr()이 항상
__chk_io_ptr()이 항상 "(void)0"으로 확장되는 매크로인 건 아닙니다. 헤더 파일을 보면 __CHECKER__ 심볼 정의 여부에 따라 extern 함수 선언이거나 (void)0이 되는데, __CHECKER__ 심볼은 sparse라는 커널 소스 분석 툴과 관련돼 있습니다. 즉, sparse를 사용하지 않는다면
즉,
입니다.
__force 역시도 __CHECKER__ 심볼이 정의돼 있을 때만 뭔가로 확장됩니다. 따라서 또 생략~
volatile은 이미 알고 계시겠죠. "최적화 하겠다고 깝치지 말고 시킨 대로 그 위치에서 꼭 읽으셈" 정도의 의미...
즉, 핵심은 주어진 주소에서 unsigned int 값을 읽는 것입니다. memory-mapped I/O일 테니까 컴파일러 최적화에 영향 받지 않게 하기 위해 volatile 키워드를 추가한 것이고, sparse를 이용한 정적/동적 분석을 위해 검사 함수 __chk_io_ptr()과 지시자 __force를 추가한 것입니다.
$PWD `date`
친절한 답변 감사드리고, 하나만 더 질문드려 봅니다.
#define __raw_readl(a) ((void)0, *(volatile unsigned int __force *)(a))에서
#define __raw_readl(a) (*(volatile unsigned int __force *)(a))로
(void)0이 생략되는데,
그냥 무시하는 건가요?
무시하는 것을 어떻게 이해하면 될지?
(우매한 질문일지 모른다는 불안감이...)
앞서 답변 드린 내용과 마찬가지로 "(void)0"의
앞서 답변 드린 내용과 마찬가지로 "(void)0"의 정체 역시 검색 엔진을 통해 어렵지 않게 정보를 얻으실 수 있습니다. :-)
요약하자면 place-holder입니다.
자... __chk_io_ptr() 함수를 호출한 후 주어진 주소를 dereference 하는 함수 형태 매크로를 만들고 싶다고 해보겠습니다.
정도면 무난하겠지요. 그런데 __CHECKER__ 심볼이 없을 때는 __chk_io_ptr() 함수 호출을 하지 않게 하고 싶습니다. 어떻게 해야 할까요? 간단하게 생각하면 다음처럼 할 수 있을 겁니다.
하지만 이런 종류의 매크로가 많다면 좀 귀찮은 작업이 됩니다. 게다가 dereference 코드가 중복돼 있는 것도 아름답지 않아 보입니다.
그렇다면... __CHECKER__ 심볼이 정의돼 있지 않을 때에는 __chk_io_ptr()이 아무 것도 하지 않는 expression이 되도록 하면 어떨까요?
(0이라는 값 자체는 중요하지 않습니다. __chk_io_ptr(x)을 (0) 대신 (42) 등으로 정의해도 다르지 않습니다.)
근데 이렇게 하면 __CHECKER__가 정의돼 있지 않을 때, 즉 __raw_readl(a)이 다음과 같이 확장될 때:
-Wall 옵션을 써서 (더 정확히는 -Wunused-value 옵션을 써서) 컴파일 하면 "left-hand operand of comma expression has no effect"라는 경고가 나옵니다. 분명 의도한 대로 작성한 적법한 코드이긴 한데 컴파일러는 뭐라뭐라 그러고... 그런데 앞에다 "(void)"를 붙이면? 와~ 컴파일러 경고가 사라졌습니다.
왜 컴파일러가 "0, ..."에 대해선 쫑알대면서 "(void)0, ..."에는 조용한지에 대해선 제가 아는 게 얕아 말씀을 못 드립니다~
$PWD `date`
자세한 설명 감사합니다.
이해가 쏙쏙 되네요. 감사합니다.
댓글 달기