menuconfig和、Kconfig介绍及例子解析!

嵌入式大杂烩 2022-04-10 21:55

1. menuconfig 和Kconfig 介绍

有过 linux 内核开发经验的人,对menuconfig 不会陌生。对于各类内核,只要是支持menuconfig 配置界面,都是使用Kconfig。

换言之:

  • menuconfig:支持配置内核的图形化界面。
  • Kconfig:生成menuconfig 界面的脚本语言。

故我们只要熟悉了Kconfig 的语法规则,就熟悉了 menuconfig的应用。这样对于基于menconfig 配置界面的各类内核都能得心应手了。

2. 配置界面

linux 内核的配置界面如下:

思考两个问题:

  • 这个配置文件是如何组织和生成的?
  • 各项配置又是如何被使用的?

2.1 界面生成和组织

熟悉内核的都知道, 配置内核的过程中只需要执行 make menconfig 界面就自动出来了。

那么,在执行make mneconfig 的过程中到底发生了什么?

Makefile
    scripts/kconfig/Makefile
  • 顶层Makefile:依赖子makefile。这里MAKECMDGOALS 变量很重要。
  • scripts/kconfig/Makefile。顶层makefile 执行

make menuconfig 过程:

  • 首先执行顶层Makefile。
  • 然后执行scripts/kconfig/Makefile
  • 编译 kconfig 下相关工具。
  • 生成mconf 工具

lxdialog:checklist/inputbox/menubox/texbox/yesno等图形显示组件mconf:menuconfig 读写解析应用 

menu:菜单处理 

conf:xxxdefconfig 解析

mconf 核心代码如下:

//script/kconfig/mconf.c
int main(int ac, char **av)
{
    char *mode;
    int res; 
setlocale(LC_ALL, ""); 
    bindtextdomain(PACKAGE, LOCALEDIR);
    textdomain(PACKAGE);

    signal(SIGINT, sig_handler);

    conf_parse(av[1]);
    conf_read(NULL);

   mode = getenv("MENUCONFIG_MODE");
   if (mode) {
        if (!strcasecmp(mode, "single_menu"))
            single_menu_mode = 1
     }

     if (init_dialog(NULL)) {
           fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
           fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
            return 1;
        }
    set_config_filename(conf_get_configname());
    conf_set_message_callback(conf_message_callback);
    do { 
       conf(&rootmenu, NULL);
       res = handle_exit();
    } while (res == KEY_ESC);

    return res;
}

我们可以看到,干了三件事:

  • 解析Kconfig:./mconf Kconfig
  • 生成对话框:init_dialog
  • 配置界面:conf

最终会将配置界面设置保存成 .config 文件。

2.2 .config 应用

我们在编译内核前通过有两种操作:

  • make xxx_defconfig;make uImage;
  • make xxx_defconfig; make menucnfig; make uImage;

make xxx_defconfig 操作会生成 conf 应用,并且解析xxx_defconfig。make menuconfig 操作会生成 mconf 应用,会将我们配置的选项保存成 .config

当我们在执行编译内核的时候,会自动将 .config 里面的配置 转换成相应的宏到 autoconf.h 里面

2.2.1 .config 保存

//mconf
// 对话框退出
main()
    handle_exit()
        conf_write() //script/kconf/confdata.c
            conf_message(_("configuration written to %s"), newname)
 
 // 配置后保存
 main()
    conf()
        conf_save()
            conf_write() //script/kconf/confdata.c
                conf_message(_("configuration written to %s"), newname)
                
                
// conf : conf 直接将xxx_defconfig 保存成 .config 
main()
    conf_write()

无论是是 menuconfg 配置, 还是解析 xxx_defconfig 最终都会先保存成 .config

2.2.2 .config 解析

当我们配置生成好 .config 后。在编译内核的时候,会提前将 .config 转换对应的宏。

//conf.c
main();
    conf_write_autoconf();
     file_write_dep("include/config/auto.conf.cmd");
     ....
     if (!name)
            name = "include/generated/autoconf.h";
      if (rename(".tmpconfig.h", name))
            return 1;
      name = getenv("KCONFIG_TRISTATE");
      if (!name)
            name = "include/config/tristate.conf";
      if (rename(".tmpconfig_tristate", name))
            return 1;
      name = conf_get_autoconfig_name();

2.2.3 总结

linux 内核主要是基于 Kconfig 来组织menuconfig从而达到配置内核的目的。那么主要从两方面入手。

  • make menuconfig :生成mconf 应用,产生图形界面,并且保存.config
  • make xxx_defconf:生成conf 应用,解析xxx_defconf,并保存成.config

本质上.config 和 xxx_defconfig 是同一文件

在编译内核的过程中会将 .config 转换为相应的宏,包含在头文件autoconf.h 中,这样就可以供内核使用了。

故我们只需要掌握了 Kconfig 配置,就基本掌握了menuconfig 配置和添加流程。

3. Kconfig 常用语法

3.1 配置项前缀

在Kconfig文件中,假设配置项的名字是XXX,在.config文件中:

  • 默认情况下,它对应的变量名为CONFIG_XXX
  • 如果设置了环境变量CONFIG_=ABC,则对应的变量名为ABC_XXX
    

3.2 单个配置项 config

如图 USB Webcam Gadget 就是一个配置项:

  • 输入M:编成模块形式。.config 对应 CONFIG_USB_G_WEBCAM=M
  • 输入N:不选择配置。.config 对应 CONFIG_USB_G_WEBCAM is not set

3.2.1. 语法

我们还是以一个例子说明:

# put drivers that need isochronous transfer support (for audio
# or video class gadget drivers), or specific hardware, here.

config USB_G_WEBCAM
        tristate "USB Webcam Gadget"
        depends on VIDEO_DEV
        select USB_LIBCOMPOSITE
        select VIDEOBUF2_VMALLOC
        help
            The Webcam Gadget acts as a composite USB Audio and Video Class device. It provides a userspace API to process UVC control requests and stream video data to the host. Say "y" to link the driver statically, or "m" to build a dynamically linked module called "g_webcam".

config 配置基础语法如下:

config option
    type "xxx"       //简单描述
    depends on xxx //依赖选项,可选
    default xxx      //初始值
    help              //帮助信息
        xxxxxxxxxxxxxxx
  • config option 是一个配置的开始,紧跟着的是配置选项的名称。
  • config 下定义了以下属性:
    • 类型、输入提示、依赖关系、默认值、帮助信息。
    • 每个表示配置的菜单都有类型。变量共有五种类型。
      • bool:布尔类型
      • tristate:三态类型
      • string:字符串
      • hex:十六进制
      • int:整型

    • "USB Webcam Gadget":提示信息
    • depends on:表示依赖关系。只有VIDEO_DEV 选中,才可以选择该项
    • default:表示配置项的默认值。bool 类型可以是 y/n
    • help:帮助信息

3.2.2. 示例

config TEST_A
    bool "config test A"
    default y
    help
        test config test A, yes/no
 
 config TEST_B
    bool "config test B"
    depends on TEST_A
    default y
    help
        test config test B, yes/no

TEST_B 只有在A 选中才能生效。

3.3. 菜单menu/endmenu

如图 USB audio choice 包含两个配置项。UAC1_PLAY 和 UAC1_CAP

3.3.1. 语法

menu "USB audio choice"
        depends on GADGET_UAC1

config GADGET_UAC1_PLAY
        tristate "USB audio play"
        default y

config GADGET_UAC1_CAP
        default y
        tristate "USB audio cap" 
choice
        prompt "cap from"
        default MIC
        depends on GADGET_UAC1_CAP

config GADGET_UAC1_CAP_USER
        bool "cap from user"

config GADGET_UAC1_CAP_MIC
        bool "cap from mic" 

endchoice 
endmenu

我们先忽略 choice 和 endchoice。menu 语法以 menu 开始,endmenu 结束。中间包含若干项config配置, 当然也可以包含 其他语法

3.3.2. 示例

menu "test menu"
    config TEST_MENU_A
        tristate "menu test A"

    config TEST_MENU_B
        bool "menu test B"
        default n                           
endmenu

test menu 包含两个配置项

3.4. 单选 choice/endchoice

如图为 linux usb gadget 驱动,支持各种gadget 设备:

3.4.1 语法

choice
config USB_G_HID
        tristate "HID Gadget"
        select USB_LIBCOMPOSITE
        help
        ¦ The HID gadget driver provides generic emulation of USB
        ¦ Human Inter
# put drivers that need isochronous transfer support (for audio
# or video class gadget drivers), or specific hardware, here.
......
config USB_G_WEBCAM
        tristate "USB Webcam Gadget"
        depends on VIDEO_DEV
        select USB_LIBCOMPOSITE
        select VIDEOBUF2_VMALLOC
        help
        ¦ The Webcam Gadget acts as a composite USB Audio and Video Class
        ¦ device. It provides a userspace API to process UVC control requests
        ¦ and stream video data to the host.

        ¦ Say "y" to link the driver statically, or "m" to build a
        ¦ dynamically linked module called "g_webcam".
endchoice
  • choice 开始,endchoice 结束。
  • choice 中间可以加入其他配置,以及 choice 嵌套
  • 他们之间只能有一个被设置为 y:表示编译进内核
  • 他们之间可以有多个被设置为 m:表示编译成模块

3.4.2. 示例

choice
    prompt "The maximal size of fifo"
    default USB_FIFO_512
    
    config USB_FIFO_512
        bool "512"
        
    config USB_FIFO_1024
        bool "1024"
        
    config USB_FIFO_3072
        bool "3072"

endchoice

      

3.5. menuconfig

menuconfig XXX和config XXX类似, 唯一不同的是该选项除了能设置y/m/n外,还可以实现菜单效果(能回车进入该项内部)。

比如 usb gadget 驱动就是 menuconfig 配置

3.5.1. 语法

menuconfig常用格式有2种:

  menuconfig M
  if M
      config C1
      config C2
  endif

或者

  menuconfig M
  config C1
      depends on M
  config C2
      depends on M

第1项menuconfig M跟config M语法是一样的, 不同之处在于menuocnfig M后面可以跟着好几个依赖于M的config C1、config C2等子配置项.

3.6. if/endif

3.6.1. 语法

在上面的menuconfig中就有if/endif的使用,它的语法如下:

if xxx
endif

3.6.2. 示例

if USB_GADGET

config USB_GADGET_DEBUG
        boolean "Debugging messages (DEVELOPMENT)"
        depends on DEBUG_KERNEL
        help 
        ¦  Many controller and gadget drivers will print some debugging
        ¦  messages if you use this option to ask for those messages.

        ¦  A
 ......
 endif

只有定义了 USB_GADGET ,以下部分才会显示出来。

3.7. source

3.7.1. 语法

source 语句用于读取另一个文件中的 Kconfig 文件, 比如driver/usb/Kconfig 中就包含了其他Kconfig:

source "drivers/usb/gadget/Kconfig"

3.8. comment

3.8.1. 语法

comment 语句出现在界面的第一行,用于定义一些提示信息,如:


界面如下:

4. 总结

本文主要分析了 menuconfig 生成和使用过程,并且介绍了Kconfig 常见用法及语法介绍。

有关 config/menu/menuconfig/choice等 Kconfig语法本质上就是脚本语言,也存在对应的相互组合关系,每种语法规则不是独立的。熟悉了 Kconfig 基本组织规则,那么就熟悉了 内核配置过程。无论是 linux 还是 rtos 只要是基于menconfig 配置的都是一通百通。


猜你喜欢:

分享两点提高编程能力的建议!

嵌入式如何进行架构设计?

干货 | 嵌入式OTA升级实现原理

学STM32需要学会哪些才建议去学Linux?

一个小巧灵活的按键处理库!

嵌入式 C 结构体内存对齐


在公众号聊天界面回复1024,可获取嵌入式资源;回复 ,可查看文章汇总。

点击阅读原文,查看更多分享。

嵌入式大杂烩 专注于嵌入式技术,包括但不限于C/C++、嵌入式、物联网、Linux等编程学习笔记,同时,内包含大量的学习资源。欢迎关注,一同交流学习,共同进步!
评论 (0)
  • 文/Leon编辑/cc孙聪颖‍2023年,厨电行业在相对平稳的市场环境中迎来温和复苏,看似为行业增长积蓄势能。带着对市场向好的预期,2024 年初,老板电器副董事长兼总经理任富佳为企业定下双位数增长目标。然而现实与预期相悖,过去一年,这家老牌厨电企业不仅未能达成业绩目标,曾提出的“三年再造一个老板电器”愿景,也因市场下行压力面临落空风险。作为“企二代”管理者,任富佳在掌舵企业穿越市场周期的过程中,正面临着前所未有的挑战。4月29日,老板电器(002508.SZ)发布了2024年年度报告及2025
    华尔街科技眼 2025-04-30 12:40 301浏览
  • 你是不是也有在公共场合被偷看手机或笔电的经验呢?科技时代下,不少现代人的各式机密数据都在手机、平板或是笔电等可携式的3C产品上处理,若是经常性地需要在公共场合使用,不管是工作上的机密文件,或是重要的个人信息等,民众都有防窃防盗意识,为了避免他人窥探内容,都会选择使用「防窥保护贴片」,以防止数据外泄。现今市面上「防窥保护贴」、「防窥片」、「屏幕防窥膜」等产品就是这种目的下产物 (以下简称防窥片)!防窥片功能与常见问题解析首先,防窥片最主要的功能就是用来防止他人窥视屏幕上的隐私信息,它是利用百叶窗的
    百佳泰测试实验室 2025-04-30 13:28 534浏览
  • 在智能硬件设备趋向微型化的背景下,语音芯片方案厂商针对小体积设备开发了多款超小型语音芯片方案,其中WTV系列和WT2003H系列凭借其QFN封装设计、高性能与高集成度,成为微型设备语音方案的理想选择。以下从封装特性、功能优势及典型应用场景三个方面进行详细介绍。一、超小体积封装:QFN技术的核心优势WTV系列与WT2003H系列均提供QFN封装(如QFN32,尺寸为4×4mm),这种封装形式具有以下特点:体积紧凑:QFN封装通过减少引脚间距和优化内部结构,显著缩小芯片体积,适用于智能门铃、穿戴设备
    广州唯创电子 2025-04-30 09:02 336浏览
  • ‌一、高斯计的正确选择‌1、‌明确测量需求‌‌磁场类型‌:区分直流或交流磁场,选择对应仪器(如交流高斯计需支持交变磁场测量)。‌量程范围‌:根据被测磁场强度选择覆盖范围,例如地球磁场(0.3–0.5 G)或工业磁体(数百至数千高斯)。‌精度与分辨率‌:高精度场景(如科研)需选择误差低于1%的仪器,分辨率需匹配微小磁场变化检测需求。2、‌仪器类型选择‌‌手持式‌:便携性强,适合现场快速检测;‌台式‌:精度更高,适用于实验室或工业环境。‌探头类型‌:‌横向/轴向探头‌:根据磁场方向选择,轴向探头适合
    锦正茂科技 2025-05-06 11:36 36浏览
  • 想不到短短几年时间,华为就从“技术封锁”的持久战中突围,成功将“被卡脖子”困境扭转为科技主权的主动争夺战。众所周知,前几年技术霸权国家突然对华为发难,导致芯片供应链被强行掐断,海外市场阵地接连失守,恶意舆论如汹涌潮水,让其瞬间陷入了前所未有的困境。而最近财报显示,华为已经渡过危险期,甚至开始反击。2024年财报数据显示,华为实现全球销售收入8621亿元人民币,净利润626亿元人民币;经营活动现金流为884.17亿元,同比增长26.7%。对比来看,2024年营收同比增长22.42%,2023年为7
    用户1742991715177 2025-05-02 18:40 45浏览
  • 一、gao效冷却与控温机制‌1、‌冷媒流动设计‌采用低压液氮(或液氦)通过毛细管路导入蒸发器,蒸汽喷射至样品腔实现快速冷却,冷却效率高(室温至80K约20分钟,至4.2K约30分钟)。通过控温仪动态调节蒸发器加热功率,结合温度传感器(如PT100铂电阻或Cernox磁场不敏感传感器),实现±0.01K的高精度温度稳定性。2、‌宽温区覆盖与扩展性‌标准温区为80K-325K,通过降压选件可将下限延伸至65K(液氮模式)或4K(液氦模式)。可选配475K高温模块,满足材料在ji端温度下的性能测试需求
    锦正茂科技 2025-04-30 13:08 440浏览
  • 多功能电锅长什么样子,主视图如下图所示。侧视图如下图所示。型号JZ-18A,额定功率600W,额定电压220V,产自潮州市潮安区彩塘镇精致电子配件厂,铭牌如下图所示。有两颗螺丝固定底盖,找到合适的工具,拆开底盖如下图所示。可见和大部分市场的加热锅一样的工作原理,手绘原理图,根据原理图进一步理解和分析。F1为保险,250V/10A,185℃,CPGXLD 250V10A TF185℃ RY 是一款温度保险丝,额定电压是250V,额定电流是10A,动作温度是185℃。CPGXLD是温度保险丝电器元件
    liweicheng 2025-05-05 18:36 49浏览
  •  一、‌核心降温原理‌1、‌液氮媒介作用‌液氮恒温器以液氮(沸点约77K/-196℃)为降温媒介,通过液氮蒸发吸收热量的特性实现快速降温。液氮在内部腔体蒸发时形成气-液界面,利用毛细管路将冷媒导入蒸发器,强化热交换效率。2、‌稳态气泡控温‌采用‌稳态气泡原理‌:调节锥形气塞与冷指间隙,控制气-液界面成核沸腾条件,使漏热稳定在设定值。通过控温仪调整加热功率,补偿漏热并维持温度平衡,实现80K-600K范围的快速变温。二、‌温度控制机制‌1、‌动态平衡调节‌控温仪内置模糊控制系统,通过温度
    锦正茂科技 2025-04-30 11:31 30浏览
  • 在全球制造业加速向数字化、智能化转型的浪潮中,健达智能作为固态照明市场的引领者和智能电子以及声学产品的创新先锋,健达智能敏锐捕捉到行业发展的新机遇与新挑战,传统制造模式已难以满足客户对品质追溯、定制化生产和全球化布局的需求。在此背景下, 健达智能科技股份有限公司(以下简称:健达智能)与盘古信息达成合作,正式启动IMS数字化智能制造工厂项目,标志着健达智能数字化转型升级迈入新阶段。此次项目旨在通过部署盘古信息IMS系统,助力健达实现生产全流程的智能化管控,打造照明行业数字化标杆。行业趋势与企业挑战
    盘古信息IMS 2025-04-30 10:13 33浏览
  • 浪潮之上:智能时代的觉醒    近日参加了一场课题的答辩,这是医疗人工智能揭榜挂帅的国家项目的地区考场,参与者众多,围绕着医疗健康的主题,八仙过海各显神通,百花齐放。   中国大地正在发生着激动人心的场景:深圳前海深港人工智能算力中心高速运转的液冷服务器,武汉马路上自动驾驶出租车穿行的智慧道路,机器人参与北京的马拉松竞赛。从中央到地方,人工智能相关政策和消息如雨后春笋般不断出台,数字中国的建设图景正在智能浪潮中徐徐展开,战略布局如同围棋
    广州铁金刚 2025-04-30 15:24 283浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦