Linux下menuconfig与Kconfig基础知识概要

news2024/11/20 18:32:49

 一、简介

menuconfig是Linux平台用于管理代码工程、模块及功能的实用工具。上至决定某一程序模块是否编译,下到某一行具体的代码是否需要编译以及某个项的值在本次编译时该是什么都可由menuconfig来定义。

menuconfig的使用方式通常是在编译系统之前在系统源代码根目录下执行 make menuconfig 命令从而打开一个图形化配置界面,再通过对各项的值按需配置从而达到影响系统编译结果的目的。一个典型的 menuconfig 配置界面如下图所示:

menuconfig 配置后的结果将会保存在对应模块根目录下的 .config 文件中。如kernel源码根目录或应用程序源码根目录。Linux在编译系统镜像时会加载这些 .config 文件中的配置项来决定编译结果。

menuconfig 其实只能算是一个“前端”,用于支撑它、决定它拥有什么配置项的“后端”则被称为 Kconfig。

Kconfig 严格来讲是一种编程语言,它拥有自己的语法及结构。正是这些语法和结构组成了menuconfig在用户眼前不同的表现形式。

不过幸好,Kconfig这门“编程语言”的内容很少,通常只需花上半个小时就能掌握大半了。而这篇博文主要也是在介绍Kconfig的知识。

总得来说,menuconfig是Linux平台基于Kconfig用于管控代码实用工具。

二、常用的Kconfig语法

Kconfig的语法及代码结构非常简单。本博文只介绍Kconfig中常用的几个知识点。更详尽的内容可以参阅Linux官方提供的帮助文档。这份文档们于内核源码目录下的 ./Document/kbuild/kconfig-language.txt 。本文也已将此文档作为附件贴在文末了。

所谓 Kconfig,其实就是一个位于要被控制的程序模块源码目录下的文件名为 Kconfig 的普通的文本文件而已。

Kconfig文件在Linux系统中的数量是不确定的。我们既可以将所有配置项写在一个Kconfig文件上,又可以分模块分功能将它们分别写在不同的Kconfig文件中。一般来讲,都是在各个程序或模块的根目录下创建一个Kconfig用于记录所有配置该程序/模块的配置项。然后再在其父级目录的Kconfig中通过 souce code_demo/Kconfig 的形式将其引入到menuconfig系统中去。

Kconfig常用的几个知识点有以下五个:

1、config模块

2、menuconfig模块

3、menu模块

4、choice模块

5、if 与 depends on 模块

2.1、config模块

config模块是Kconfig最基础最重要的知识点。一个config就表示一个配置项。其语法如下所示:

config 配置项名
    配置项类型
    配置项提示语
    其它选项

配置项名表示最终保存在 .config 文件中的键值对项的键名,通常用全大写和单词之间以下划线隔开的形式书写。

配置项类型就是基础类型,可选的类型有:bool、tristate、string、hex、int。

bool 表示布尔型在.config中以 y 和 n 表示。

tristate是三态类型,通常用在内核驱动控制中。在.config中以 y 、n和m表示。y表示将驱动编译进内核镜像,n表示不编译,m表示将驱动编译为ko形式。

string是普通字符串类型,直接将在menuconfig图形界面中用户输入的值原样保存在.config中。

hex是十六进制形式,只能输入0~F的内容。

int是十进制整数形式,只能输入数字。

配置项提示语以prompt开头,后跟一个空格字符,然后就是用双引号包围的文字提示语。作用就是在menuconfig图形界面中作为配置项的提示语。如下图所示:

其它选项这里暂且不管。

下面我们尝试编写一个包含了 config 内容的Kconfig。

在目录menu_demo下新建一个Kconfig文件,内容如下所示:

config KCONFIG_DEMO_ITEM1
    bool
    prompt "demonstate item1 for bool learning"

config KCONFIG_DEMO_ITEM2
    string
    prompt "demonstate item2 for string learning"

config KCONFIG_DEMO_ITEM3
    hex
    prompt "demonstate item3 for hex learning"

然后再其父目录上的Kconfig中将此Kconfig文件加载进来:

#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#
mainmenu "Users Configuration"

# menu "Applications Settings"

source "menu_demo/Kconfig"

然后在系统源码根目录下执行 make menuconfig 后即可看到我们刚添加进去的几个配置项了,如下图所示:

如果配置项是 bool、tristate 类型,则通过空格键来切换它们的选项值。其它类型值则通过回车键打开输入框来键入对应的值完成配置。
这里我们将第一项选上,第二项随意输入一个字符串,第三项留空,然后一路退出menuconfig并保存,可以看到.config文件关于我们新增的配置项的内容如下所示:

root@ubuntu:~/workspace/rtl8197/rtl819x# head -n 20 users/.config
#
# Automatically generated make config: don't edit
# RLX Linux builder
# Wed Jun 30 21:20:58 2021
#
CONFIG_KCONFIG_DEMO_ITEM1=y
CONFIG_KCONFIG_DEMO_ITEM2="hello world"
CONFIG_KCONFIG_DEMO_ITEM3=

此即为最基础的配置方式。

2.2、menuconfig模块

menuconfig可以认为是上一节 config 中的升级版。

首先它自己也是一个正常的配置项,通过自己的配置值来决定另外一组配置项是否作为子菜单的形式显示出来并供用户配置。具体语法如下所示:

 1 menuconfig KCONFIG_DEMO_MENUCONFIG1
 2     bool
 3     prompt "menuconfig learning"
 4 
 5 if KCONFIG_DEMO_MENUCONFIG1
 6 
 7 config MENUCONFIG_SUBITEM1
 8     bool
 9     prompt "menuconfig subitem1"
10 
11 config MENUCONFIG_SUBITEM2
12     bool
13     prompt "menuconfig subitem2"
14 
15 endif

第一行通过menuconfig配置了一个bool类型的配置项。第五行的if语句暂且不深究,只需要知道它的作用是当第一行的配置项被选中时会将if/endif之内的配置项作为 KCONFIG_DEMO_MENUCONFIG1 项的子配置项显示即可。

此配置项在menuconfig中的显示效果及其菜单内部的显示效果如下面两张图所示:

此时我们选中menuconfig配置项,其子菜单内部的效果如下图所示:

2.3、menu模块

如果说上一节的menuconfig是一个带了菜单功能的配置项,那么这个 menu 就是一个纯粹的菜单项了。menu本身不可配置,只是用来标记其内部可能拥有子配置项。

以下是示例语法:

menu "menu learning"

config MENU_SUBITEM1
        bool
        prompt "subitem1"

config MENU_SUBITEM2
        bool
        prompt "subitem2"

config MENU_SUBITEM3
        bool
        prompt "subitem3"

endmenu

对应的menuconfig显示效果如下图所示:

menu项在.config中会将菜单提示语作为注释一并写入,如下所示:

root@ubuntu:~/workspace/rtl8197/rtl819x# head -n 20 users/.config
#
# Automatically generated make config: don't edit
# RLX Linux builder
# Wed Jun 30 21:45:28 2021
#

#
# menu learning
#
CONFIG_MENU_SUBITEM1=y
# CONFIG_MENU_SUBITEM2 is not set
# CONFIG_MENU_SUBITEM3 is not set

2.4、choice模块

choice是单选模块。具体语法如下所示:

choice 
        bool
        prompt "choice learning"

config CHOICE_ITEM1
        bool
        prompt "choice1"

config CHOICE_ITEM2
        bool
        prompt "choice2"

config CHOICE_ITEM3
        bool
        prompt "choice3"
endchoice

在menuconfig中的显示效果如下图所示:

2.5、if与depends on模块

if 与 depends on 模块都属于 config 配置项中的”其它选项“。

它们的作用是等价的,都是根据指定的配置项是否被配置来决定本配置项的显示与否。

它们的语法如下所示:

config MY_CONFIG1
        bool
        prompt "my config1"

config MY_CONFIG2
        bool
        prompt "my config2" if MY_CONFIG1

config MY_CONFIG3
        bool
        prompt "my config3"
     depends on MY_CONFIG2

此配置项表示当第一个配置项为y时,就可以配置第二个配置项,当第二个配置项为y时,才能够配置第三个配置项。其效果如下图所示:

选中第一项,效果如下图所示:

选中第二项,效果如下图所示:

2.6、其它知识点

1、

配置项提示语其实可以和类型合并在一起从而省略 prompt 关键字。以下示例中的两个配置效果是等价的:

config KCONFIG_DEMO_ITEM1
    bool
    prompt "demonstate item1"

config KCONFIG_DEMO_ITEM2
    bool "demonstate item2"

2、

配置项的其它选项中可以通过 default 关键字来配置选项的默认值,如:

config MY_CONFIG1
        bool "my config1"
        default y

3、

Kconfig中还有一个模块被称为 comment,其作用就是单纯的为在其之后的配置项添加注释说明。并且会将说明内容一并写进 .config 文件中。具体效果与上面 2.3 节menu模块的注释一样。其语法如下所示:

comment "I am a comment"

config MY_CONFIG1
        bool
        prompt "my config1"

config MY_CONFIG2
        bool
        prompt "my config2" if MY_CONFIG1

comment "I'm a comment2"

config MY_CONFIG3
        bool
        prompt "my config3" 
        depends on MY_CONFIG2

在menuconfig中的效果如下图所示:

在.config中的效果如下所示:

root@ubuntu:~/workspace/rtl8197/rtl819x# head -n20 users/.config
#
# Automatically generated make config: don't edit
# RLX Linux builder
# Wed Jun 30 22:03:01 2021
#

#
# I am a comment
#
CONFIG_MY_CONFIG1=y
CONFIG_MY_CONFIG2=y

#
# I'm a comment2
#
# CONFIG_MY_CONFIG3 is not set

4、

在配置项的其它选项中还有一个 help 关键字。它的作用是为配置项添加一个更详细的说明文档。用户在menuconfig图形配置界面通过 ? 键来唤出详细文档的展示。

其语法如下所示:

config MY_CONFIG1
        bool
        prompt "my config1"
        help
        I am a help document.
        This document can be a long length

在menuconfig界面,将光标移动到my config1项上,然后通过 ? 键来唤出此帮助文档的展示窗口,如下图所示:

以上即是menuconfig与Kconfig中最常用的知识点的简要介绍了。更多完整详尽的知识请参阅附件贴出的官方文档。


官方文档下载链接: https://files.cnblogs.com/files/chorm590/kconfig-language.zip

Kconfig Language — The Linux Kernel documentation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1514077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

php.exe运行时,提示缺少VCRUNTIME140.dll

php.exe运行时,提示缺少VCRUNTIME140.dll 下载地址 https://www.microsoft.com/zh-cn/download/details.aspx?id48145根据需要选择下载3.运行安装后,再次运行php.exe。

【XMU学科实践二】豆瓣爬虫实践

文章目录 分析豆瓣阅读网站完整爬虫代码 叠甲:仅供学习。。 XMU的小朋友实在不会了可以参考我的思路,但还是建议自己敲一遍哈。 学科实践二还是挺有意思的! 分析豆瓣阅读网站 豆瓣阅读出版页面 打开浏览器开发者工具,可以看到如下…

Apache Paimon系列之:认识Paimon

Apache Paimon系列之:认识Paimon 一、认识Paimon二、统一存储三、基本概念1.文件布局2.Snapshot3.清单文件4.数据文件5.分区6.一致性保证 一、认识Paimon Apache Paimon的架构: 如上架构所示: 读/写:Paimon 支持多种读/写数据和…

CLion 配置 Qt 开发环境

文章目录 CLion 配置 Qt 开发环境环境说明基本配置1. 创建Qt项目2. 设置CLion工具链3. 配置外部工具 一些问题的补充 CLion 配置 Qt 开发环境 环境说明 操作系统:Windows 10 CLion版本:2023.3.4 CMake版本:3.27.7 Qt6版本:6.6…

后Xposed时代: 一篇文章看懂如何安装和使用Edxposed

文章转载于:https://blog.coderstory.cn/guide-install-edxposed/ 序言: 大名鼎鼎的xposed框架不必多说了吧,想要实现QQ抢红包,微信抢红包,防止消息撤回等功能必须得靠它的支持才行。xposed也是所有android系统获取root后必装的东西。但可惜…

跨境电子商务支付与结算

一、跨境电子商务支付与结算的业务架构 跨境电子商务支付与结算的业务架构,结合跨境电子商务支付与结算的技术架构,其业务架构主要包括以下五大模块 (1)商户模块。商户模块包括虚拟账户、管理平台、多币种收银台、争议管理。 &…

【Django开发】前后端分离美多商城项目第1篇:美多商城【附代码文档】

美多商城项目4.0文档完整教程(附代码资料)主要内容讲述:美多商城,项目准备,商业模式介绍,开发流程,需求分析,项目架构,创建工程,1. 在git平台创建工程1.B2B--…

flex弹性盒子实现左中右居中布局

1、效果展示 2、布局与样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>测试弹性盒子</title> </head> <body> <div class"out-parent"><div class"…

C++入门篇(2)

1. 内联函数 1.1 概念 C中&#xff0c;以 inline 修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 #include <iostream> using namespace std;int Add(int…

Java后端八股文之java基础

文章目录 0.Java 中有 8 种基本数据类型1. 为什么浮点数运算会丢失精度&#xff1f;如何解决&#xff1f;2. 面向对象的三大特征2.1 封装2.2 继承2.3 多态 3. 深拷贝和浅拷贝的区别&#xff1f;什么是引用拷贝&#xff1f;4. equals方法与“”方法4.1 4.2 equals方法 5.hashcod…

LeetCode543题:二叉树的直径(python3)

代码思路&#xff1a; 先递归调用左儿子和右儿子求得它们为根的子树的深度 L和 R &#xff0c;则该节点为根的子树的深度即为max(L,R)1。该节点的 dnode值为LR1 递归搜索每个节点并设一个全局变量 ans记录 dnode的最大值&#xff0c;最后返回 ans-1 即为树的直径。 # Definit…

蓝桥杯历年真题省赛 java b组 2016年第七届 凑算式

一、题目 凑算式 B DEF A --- ------- 10 C GHI 这个算式中A~I代表1~9的数字&#xff0c;不同的字母代表不同的数字。 比如&#xff1a; 68/3952/714 就是一种解法&#xff0c; 53/1972/486 是另一种解法。 这个算式一共有多少种解法&#xff1f; 注意&a…

数据结构---C语言版 树 图解版力扣144/94/102

树的声明&#xff1a; #include<stdio.h> #include<stdlib.h> using namespace std;typedef char BiElemType; typedef struct BiTNode{BiElemType data;struct BiTNode* lchild;struct BiTNode* rchild; }BiTNode,*BiTree; //树中任何一个节点都是一个结构体&am…

优秀的前端框架vue,原理剖析与实战技巧总结【干货满满】

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端零基础教学&#xff0c;实战进阶 景天的主页&#xff1a;景天科技苑 文章目录 Vuevue.js库的基本使用vue.js的M-V-VM思…

CountDownLatch介绍和使用

1. CountDownLatch是什么 CountDownLatch 是 Java.util.concurrent 包中的一个同步工具类&#xff0c;用于控制线程的执行顺序。它的主要作用是让一个或多个线程等待其他线程完成操作后再继续执行。 2. CountDownLatch 类常用方法 CountDownLatch(int count) 是 CountDownLa…

网工内推 | 国企、上市公司网工、运维,CCNA即可,补贴福利多

01 深圳新思 招聘岗位&#xff1a;网络工程师&#xff08;中电集团&#xff09; 职责描述&#xff1a; 1&#xff1a;负责办公室电脑的桌面运维&#xff0c;主要是windows维护与应用维护&#xff1b; 2&#xff1a;负责办公室网络设备配置&#xff0c;如防火墙&#xff0c;交换…

应用工程中获取Shapefile文件的图形信息并显示

本文用纯前端获取shp文件以及前后端交互的方式获取Shapefile文件中的图形信息 1.案例说明 在日常的WebGIS开发中&#xff0c;我们往往会面对&#xff0c;需要用户选择矢量数据&#xff0c;通过矢量数据中的空间范围信息&#xff0c;显示在界面上&#xff0c;并给用户的下一步…

目标检测C-RNN,Fast C-RNN,Faster C-RNN,SSD,Mask R-CNN 理论简单介绍

参考&#xff1a; https://zh-v2.d2l.ai/chapter_computer-vision/multiscale-object-detection.html R-CNN 及系列 区域卷积神经网络 region-based CNN R-CNN R-CNN首先从输入图像中选取若干&#xff08;例如2000个&#xff09;提议区域&#xff0c;并标注它们的类别和边界…

两个笔记本如何将一个笔记本作为另一个笔记本的拓展屏

需求是有两个笔记本&#xff0c;一个笔记本闲置&#xff0c;另一个笔记本是主力本。想将另一个闲置的笔记本连接到主力本上作为拓展屏使用。网上搜了好久&#xff0c;有一些人提到了&#xff0c;也有一些视频但是文章比较少。简单总结一下吧 上述需求有两种方式 第一种&#x…

学习vue3第五节(reactive 及其相关)

1、定义 reactive() 创建一个响应式代理对象&#xff0c;不同于ref()可以创建任意类型的数据&#xff0c;而reactive()只能是对象&#xff0c;会响应式的深层次解包任何属性&#xff0c;将其标注为响应式 响应式是基于ES6的proxy实现的代理对象&#xff0c;该proxy对象与原对象…