안녕하세요..
gcc info 파일 그리고 assembler info파일등을 찾아도 없네요.. 구글검색해도 찾기가 어렵네요.. 커널 소스중 다음과 같은 부분이 있던데요,
#define __iomem __attribute__((noderef, address_space(2)))
noderef, address_space가 무슨의미인지요?
커널 코드에서 나오는 궁금증은 커널 코드안에 답이 있습니다.http://lxr.linux.no/linux 에서 찾아보시면 됩니다.
키워드 : __iomem, address_space
크로스 레퍼런스 브라우징을 해 보니 어디 어디서 참조되는 것만 나옵니다. gcc compiler의 C extension에 속하는 attribute, 그렇겠지요.
http://lkml.org/lkml/2004/9/12/230
의 글 타래를 읽어보니까, noderef는
no dereference라는 뜻이더군요. address_space에 대한 얘기는 없고...
address_space는 뭐, 유저 스페이스 커널 스페이스등등 나눠놓고... 몇번째에 해당한다는 것 같은데요...(제 생각) 맞나요? 아시는 분?
no dereference로 선언된 포인터 변수는 dereference를 하는 것이 illegal하다고 합니다... 즉,
int my_int = 10; int __attribute__((noderef)) *my_ptr;
my_ptr = &my_int;
*my_ptr = my_int * 2;
맨 마지막 문장, 에러일것 같은데 실제 gcc 4.3.0에서는 다음과 같은
warning: ‘noderef’ attribute directive ignored
경고 메세지만 나고 컴파일은 되네요..
http://www.kernel.org/pub/software/devel/sparse
[bushi@rose net]$ cat -n ref.c 1 #ifdef __CHECK__ 2 # define __noderef __attribute__((noderef)) 3 #else 4 # define __noderef 5 #endif 6 7 int main(int argc, char **argv) 8 { 9 int a = 3; 10 int __noderef *pa_noderef; 11 int *pa; 12 13 pa_noderef = (int __noderef *)&a; 14 pa = &a; 15 16 *pa = 0; 17 *pa_noderef = 0; 18 19 return 0; 20 } [bushi@rose net]$ [bushi@rose net]$ sparse ref.c -D__CHECK__ ref.c:17:3: warning: dereference of noderef expression [bushi@rose net]$
[bushi@rose net]$ cat -n space.c 1 #ifdef __CHECK__ 2 #define __pool1 __attribute__((address_space(1))) 3 #define __pool2 __attribute__((address_space(2))) 4 extern void __chk_pool1_ptr(const volatile void __pool1 *); 5 extern void __chk_pool2_ptr(const volatile void __pool2 *); 6 #else 7 #define __pool1 8 #define __pool2 9 #define __chk_pool1_ptr(x) (void*)(0) 10 #define __chk_pool2_ptr(x) (void*)(0) 11 #endif 12 13 int main(int argc, char **argv) 14 { 15 char __pool1 *c1; 16 char __pool2 *c2; 17 18 __chk_pool1_ptr(c1); 19 __chk_pool2_ptr(c1); 20 21 __chk_pool1_ptr(c2); 22 __chk_pool2_ptr(c2); 23 24 return 0; 25 } [bushi@rose net]$ [bushi@rose net]$ sparse space.c -D__CHECK__ space.c:19:18: warning: incorrect type in argument 1 (different address spaces) space.c:19:18: expected void const volatile <asn:2>*<noident> space.c:19:18: got char <asn:1>*c1 space.c:21:18: warning: incorrect type in argument 1 (different address spaces) space.c:21:18: expected void const volatile <asn:1>*<noident> space.c:21:18: got char <asn:2>*c2 [bushi@rose net]$
+
좀 가학적인 성향을 가지셨다면... 커널 소스트리에서 make V=1 C=2
OTL
예제소스 감사합니다. 공부하는데 큰 도움이 되었습니다.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동 "만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
커널 코드에서
커널 코드에서 나오는 궁금증은 커널 코드안에 답이 있습니다.
http://lxr.linux.no/linux 에서 찾아보시면 됩니다.
키워드 : __iomem, address_space
리눅스 커널 메일링 리스트를 읽어 보니..
크로스 레퍼런스 브라우징을 해 보니 어디 어디서 참조되는 것만
나옵니다. gcc compiler의 C extension에 속하는 attribute,
그렇겠지요.
http://lkml.org/lkml/2004/9/12/230
의 글 타래를 읽어보니까, noderef는
no dereference라는 뜻이더군요. address_space에 대한 얘기는 없고...
address_space는 뭐, 유저 스페이스 커널 스페이스등등 나눠놓고... 몇번째에 해당한다는 것 같은데요...(제 생각) 맞나요? 아시는 분?
no dereference로 선언된 포인터 변수는 dereference를 하는 것이 illegal하다고 합니다... 즉,
int my_int = 10;
int __attribute__((noderef)) *my_ptr;
my_ptr = &my_int;
*my_ptr = my_int * 2;
맨 마지막 문장, 에러일것 같은데 실제 gcc 4.3.0에서는 다음과 같은
warning: ‘noderef’ attribute directive ignored
경고 메세지만 나고 컴파일은 되네요..
http://www.kernel.org/pub/sof
http://www.kernel.org/pub/software/devel/sparse
+
좀 가학적인 성향을 가지셨다면... 커널 소스트리에서
make V=1 C=2
OTL
예제소스 감사합니다.
예제소스 감사합니다.
공부하는데 큰 도움이 되었습니다.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
댓글 달기