__KERNEL__在Linux内核中有什么用途?

18

有谁能解释一下以下代码的含义?

如果未定义__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__ */
3个回答

35
当您编译内核时,在命令行上定义了__KERNEL__
用户空间程序需要访问内核头文件,但是内核头文件中的一些信息仅适用于内核。将某些语句包含在#ifdef __KERNEL__ / #endif块中可以确保用户空间程序不会看到这些语句。

这非常方便...但我们能依赖它存在吗?它在哪里有记录? - personal_cloud

7

我使用Google搜索__KERNEL__,并发现了这个

__KERNEL__宏的定义是因为有些程序(如库)包含内核代码,而有许多不需要包含的内容。因此,大多数模块都希望启用__KERNEL__宏。


这段内容涉及到“模块”,例如“编译自己的内核模块”。许多人对这个宏感到困惑,因为他们并不是在编译想要成为内核一部分的东西,所以可能需要明确说明他们不需要这个。 - tripleee

2

相同的代码被用于用户空间的iptables应用程序(以及可能是glibc和其他应用程序),因此非内核代码得到了保护。


#ifndef KERNEL / #endif 块的内容由用户空间使用。内核不会看到这些内容。 - DaVid
我喜欢这个答案,因为它包括了为什么要使用#ifdef的原因。(我想知道的是,这个cpp标志实际上在哪里有记录--或者说我们如何在新的共享内核/用户代码中依赖它?我想我们可以依赖它,因为它在这些几十年来从未改变的旧代码中。) - personal_cloud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接