【问题标题】:what is __KERNEL__ used for in linux kernel?__KERNEL__ 在 linux 内核中是做什么用的?
【发布时间】:2011-01-20 08:09:28
【问题描述】:

谁能解释一下下面的代码是什么意思?

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

【问题讨论】:

    标签: linux-kernel


    【解决方案1】:

    当你编译你的内核时,__KERNEL__ 是在命令行中定义的。

    用户空间程序需要访问内核头文件,但内核头文件中的一些信息仅供内核使用。将一些语句包装在 #ifdef __KERNEL__/#endif 块中可确保用户空间程序看不到这些语句。

    【讨论】:

    • 非常感谢。我喜欢这个答案。
    • 这非常方便......但是我们可以依赖它存在吗?它记录在哪里?
    【解决方案2】:

    我用Google搜索__KERNEL__,找到了this

    定义__KERNEL__ 宏是因为有一些程序(如库)不包含内核代码,并且有许多您不希望它们包含的内容。所以大多数模块都希望启用__KERNEL__ 宏。

    【讨论】:

    • ... 在“编译你自己的内核模块”中谈论“模块”。许多想知道这个宏的人并没有编译任何想要成为内核一部分的东西,所以可能会说明他们不想要或不需要这个。
    【解决方案3】:

    在用户空间iptables 应用程序(可能还有glibc 和其他)中使用相同的代码,因此对非内核代码有保护。

    【讨论】:

    • #ifndef __KERNEL__/#endif 块的内容被用户空间使用。内核不会看到这些。
    • 我喜欢这个答案,因为它包含了为什么人们会使用 ifdef 的原因。 (我想知道的是,这个 cpp 标志实际记录在哪里 - 否则我们如何在新的共享内核/用户代码中依赖它?我想我们可以依赖它,因为它在这个旧代码中没有几十年变了?)
    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 2019-05-14
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2011-05-09
    相关资源
    最近更新 更多