2011-01-20 15 views
13

chi può spiegare cosa significa il seguente codice?cosa è usato __KERNEL__ per il kernel linux?

se __KERNEL__ non è definito, definire i seguenti macro. quando e dove definire __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__ */ 

risposta

25

Quando si compila il kernel, __KERNEL__ è definito sulla riga di comando.

I programmi di spazio utente devono accedere alle intestazioni del kernel, ma alcune informazioni nelle intestazioni del kernel sono destinate solo al kernel. Il raggruppamento di alcune istruzioni in un blocco #ifdef __KERNEL__/#endif garantisce che i programmi dello spazio utente non visualizzino tali istruzioni.

+0

Grazie mille. Mi piace questa risposta. – DaVid

1

Lo stesso codice è utilizzato in userspace iptables applicazione (e possibilmente glibc e altri), quindi v'è una protezione per il codice non kernel.

+0

Il contenuto di #ifndef __KERNEL __/# endif è utilizzato da userspace. Il kernel non li vedrebbe. – DaVid

7

Ho utilizzato Google per cercare __KERNEL__ e trovato this.

La macro __KERNEL__ è definita perché esistono programmi (come librerie) che includono il codice del kernel e ci sono molte cose che non si desidera che includano. Quindi molti moduli vorranno che la macro __KERNEL__ sia abilitata.

+0

... Che sta parlando di "module" come in "compilazione del proprio modulo del kernel". Molte persone che si interrogano su questa macro non stanno compilando nulla che voglia far parte del kernel, quindi magari spiegando che non vogliono o hanno bisogno di questo. – tripleee

Problemi correlati