2011-01-20 4 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-блока используется пользовательским пространством. Ядро их не увидит. – DaVid

7

Я использовал Google для поиска __KERNEL__ и нашел this.

Макрос __KERNEL__ определяется тем, что существуют программы (например, библиотеки), кроме кода ядра, и есть много вещей, которые вы не хотите включать. Поэтому большинство модулей захотят включить макрос __KERNEL__.

+0

... Это говорит о «модуле», как в «компиляции вашего собственного модуля ядра». Многие люди, которые задаются вопросом об этом макросе, не компилируют ничего, что хочет быть частью ядра, поэтому, возможно, укажите, что они не хотят или не нуждаются в этом. – tripleee

Смежные вопросы