linux-startup

/*
 * IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',
 * 0 otherwise.  Note that CONFIG_FOO=y results in "#define CONFIG_FOO 1" in
 * autoconf.h, while CONFIG_FOO=m results in "#define CONFIG_FOO_MODULE 1".
 */
#define IS_ENABLED(option) __or(IS_BUILTIN(option), IS_MODULE(option))

这段内容解释了 Linux 内核中 IS_ENABLED(CONFIG_FOO) 宏的作用和实现逻辑,具体含义如下:

  1. 宏的功能IS_ENABLED(CONFIG_FOO) 是一个用于判断内核配置项 CONFIG_FOO 是否启用的宏,返回结果为:

    • 1(真):如果 CONFIG_FOO 被配置为 y(直接编译进内核)或 m(编译为可加载模块)。
    • 0(假):如果 CONFIG_FOO 未被配置(即不启用)。
  2. 背后的配置机制内核配置工具(如 kconfig)会根据用户配置生成 autoconf.h 头文件,其中:

    • CONFIG_FOO=y 时,autoconf.h 中会生成 #define CONFIG_FOO 1
    • CONFIG_FOO=m 时,autoconf.h 中会生成 #define CONFIG_FOO_MODULE 1(而非 CONFIG_FOO)。

    IS_ENABLED 宏通过检查这两种定义(CONFIG_FOOCONFIG_FOO_MODULE 是否存在),统一判断配置项是否启用,无需区分 ym 的细节。

  3. 使用场景 在内核代码中,常用于条件编译或运行时判断,例如:

    if (IS_ENABLED(CONFIG_FOO)) {
        // 当 CONFIG_FOO 为 y 或 m 时执行的代码
    }
    

    相比直接使用 #ifdef CONFIG_FOO,它能同时兼容 y(内置)和 m(模块)两种启用方式,更灵活。

简单说,这个宏的作用是“检查某配置项是否以任何形式(内置或模块)被启用”,简化了内核代码中对配置项状态的判断。