Что __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__ */

Ответы

Ответ 1

При компиляции ядра в командной строке определяется __KERNEL__.

Программам пространства пользователя требуется доступ к заголовкам ядра, но некоторые данные в заголовках ядра предназначены только для ядра. Обтекание некоторых операторов в блоке #ifdef __KERNEL__/#endif гарантирует, что программы пользовательского пространства не видят эти утверждения.

Ответ 2

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

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

Ответ 3

Тот же код используется в пользовательском пространстве iptables application (и, возможно, glibc и др.), поэтому существует защита для неядерного кода.