리눅스 커널 헤더 파일중 noderef, address_space attribute이 무엇인지요?

dobest03의 이미지

안녕하세요..

gcc info 파일 그리고 assembler info파일등을 찾아도 없네요.. 구글검색해도 찾기가 어렵네요..
커널 소스중 다음과 같은 부분이 있던데요,

#define __iomem __attribute__((noderef, address_space(2)))

noderef, address_space가 무슨의미인지요?

세이군의 이미지

커널 코드에서 나오는 궁금증은 커널 코드안에 답이 있습니다.
http://lxr.linux.no/linux 에서 찾아보시면 됩니다.

키워드 : __iomem, address_space

dobest03의 이미지

크로스 레퍼런스 브라우징을 해 보니 어디 어디서 참조되는 것만
나옵니다. 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

경고 메세지만 나고 컴파일은 되네요..

bushi의 이미지

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

Fe.head의 이미지

예제소스 감사합니다.
공부하는데 큰 도움이 되었습니다.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.