2011-01-20 3 views
13

누가 다음 코드가 무엇을 의미하는지 설명 할 수 있습니까?__KERNEL__이 (가) 리눅스 커널에서 사용되는 것은 무엇입니까?

__KERNEL__이 정의되지 않은 경우 다음 매크로를 정의하십시오. 언제 어디서 __KERNEL__을 정의합니까?

/* only for userspace compatibility */ 
#ifndef __KERNEL__ 

/* IP6 Hooks */ 
/* After promisc drops, checksum checks. */ 
#define NF_IP6_PRE_ROUTING 0 
/* If the packet is destined for this box. */ 
#define NF_IP6_LOCAL_IN  1 
/* If the packet is destined for another interface. */ 
#define NF_IP6_FORWARD  2 
/* Packets coming from a local process. */ 
#define NF_IP6_LOCAL_OUT  3 
/* Packets about to hit the wire. */ 
#define NF_IP6_POST_ROUTING 4 
#define NF_IP6_NUMHOOKS  5 
#endif /* ! __KERNEL__ */ 

답변

25

커널을 컴파일 할 때 __KERNEL__이 명령 행에 정의됩니다.

사용자 공간 프로그램은 커널 헤더에 액세스해야하지만 커널 헤더의 정보 중 일부는 커널에만 사용됩니다. #ifdef __KERNEL__/#endif 블록에 몇 개의 명령문을 넣으면 사용자 공간 프로그램이 그 명령문을 보지 못하도록합니다.

+0

대단히 감사합니다. 나는이 대답을 좋아한다. – DaVid

1

동일한 코드 iptables 사용자 공간 애플리케이션에 사용된다 (및 glibc 등), 따라서 비 커널 코드에 대한 보호가있다.

+0

#ifndef __KERNEL __/# endif 블록의 내용은 사용자 공간에서 사용됩니다. 커널은 이걸 보지 않을거야. – DaVid

7

__KERNEL__을 검색하기 위해 Google을 사용했으며 this을 찾았습니다.

__KERNEL__ 매크로는 커널 코드 포함보다 많은 라이브러리 (예 : 라이브러리)가 있기 때문에 정의되며 포함하지 않으려는 것들이 많이 있습니다. 그래서 대부분의 모듈은 __KERNEL__ 매크로를 사용하기를 원할 것입니다.

+0

... "자신의 커널 모듈 컴파일"에서처럼 "모듈"에 대해 이야기하고 있습니다. 이 매크로에 대해 궁금해하는 많은 사람들은 커널의 일부가 되고자하는 것을 컴파일하지 않기 때문에, 이것을 원하지 않거나 필요로하지 않을 수도 있습니다. – tripleee

관련 문제