2011-01-20 33 views
13

次のコードは何を意味するのでしょうか?__KERNEL__はLinuxカーネルで何のために使われていますか?

__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ブロックの内容は、userspaceによって使用されます。カーネルはこれらを見ません。 – DaVid

7

__KERNEL__を検索するのにGoogleを使用し、thisを見つけました。

__KERNEL__マクロが定義されているのは、カーネルコードを含むプログラム(ライブラリなど)が含まれていて、その中には含めたくないものがたくさんあるからです。したがって、ほとんどのモジュールでは__KERNEL__マクロが有効になります。

+0

... "自分のカーネルモジュールをコンパイルする"のように "モジュール"について言及しています。このマクロについて不思議に思う多くの人々は、カーネルの一部になりたいものをコンパイルしていないので、これを望まない、または必要としないかもしれないことを綴っています。 – tripleee

関連する問題