Что __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
и др.), поэтому существует защита для неядерного кода.