Linux中Kconfig结构分析

目录结构中,某一层的内容无非就是,要么全是目录,要么全是文件,要么既有目录又有文件,我们的Kconfig文件通常是分布在各级目录中。那么,这些Kconfig如何一层一层地去组织起来呢?

首先明确下,什么时候需要Kconfig呢?在某个层级中的文件需要用CONFIG_XX_XX宏来控制的时候,就可以在该层级下写一个Kconfig。我们知道,Kconfig是从上到下层层调用的,所以,我们每写一个Kconfig,都需要将其和上层的Kconfig给关联起来。

举例:linux/drivers/i2c

就以linux/drivers/i2c这个驱动目录为例

向上,它有drivers这一层

向下,也有几个目录加一些文件

每个层级下,都有一个Kconfig

我们从最底层开始分析,所以,先分别进入algos目录、busses目录以及muxes目录查看对应的Kconfig。

注意,我们查看或者写Kconfig时,不需要关注里面有哪些文件,只需要关注当前目录下这些文件里需要使用到哪些配置项即可,所以,一般是一边写程序一边完善Kconfig文件。如果不需要用到任何配置项,那压根就不需要Kconfig。不过一般都是需要的,因为通常同目录下的Makefile都需要用对应的配置项来进行条件编译,所以Makefile一般都是和Kconfig一起出现的。

↓algos目录

其中,一个config就表示一个配置项,其语法如下所示:

其中,配置项名、配置项类型、配置项提示语是必选的,其他选项按需选择。

配置项提示语以prompt开头,后跟一个空格字符,然后就是用双引号包围的文字提示语。作用就是在menuconfig图形界面中作为配置项的提示语。所以,不要以为我们界面上看到的就是配置项,其实不是的,真正显示的是提示语,而最终写到.config里的,是CONFIG_配置项名,配置项类型决定的是当前宏定义可以赋予什么类型的值。

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

config KCONFIG_DEMO_ITEM1boolprompt "demonstate item1"config KCONFIG_DEMO_ITEM2bool "demonstate item2"

所以,上述algos目录中的Kconfig里其实就是最简单的几个配置项。

除了config配置项,还有一个menu和endmenu,这是啥?

menu 就是一个纯粹的菜单项,menu本身不可配置,只是用来标记其内部可能拥有子配置项,menu项最后在.config中会将菜单提示语作为注释一并写入。

↓busses目录

这个目录下的Kconfig配置项很多,不过,结构也是一个menu加很多config的形式。

↓muxes目录

好了,这个目录下的Kconfig也是类似的。

.i2c目录

再接着上一层,看看i2c目录下的Kconfig

大体上,也是menu加上好多config配置项。

不过,除了这一层文件用到的配置项,还因为这层目录下面有三个子目录,每个子目录里都有一个Konfig,而menuconfig界面展示各个配置项的时候是从顶层开始从上往下一层一层地展开,所以,必然要将这层的Kconfig和下层目录的Kconfig关联起来,为了完成这个关联,就要在这层目录的Kconfig里导入下一层目录里的Kconfig,比如

这里用到source模块

source条目用于读取另一个Kconfig文件,一般都是上级目录中的Kconfig包含下级目录中的Kconfig,从而形成层级结构,在menuconfig的体现就是菜单展开,稍后展示i2c这个目录的总体menuconfig效果。

↑dirvers目录

我们再往上看一层,看看dirvers这层目录里的Kconfig是什么样的。

这一层没有任何配置项,全是source导入,也就是说,这一层没有专用于该层的一些配置项。

这里要注意,这一层虽然没有源文件或者头文件,几乎全是子目录,但是有Makefile文件,Makefile里用到了很多配置项,比如:

这些配置项,虽然没有在这一层的Kconfig里定义,但并不是不能用,只是并不是这一层专用的罢了。

事实上,这里有个容易误解的地方,以为每一层只能使用这一层的Kconfig定义的配置项,其实不是的,我们在各层定义各层专用的配置项,只是出于模块化的考虑,实际上,各层定义的所有配置项,最终都会统一保存到.config中去,我们所使用的也是.config文件里的带CONFIG_前缀的配置项,linux已经在顶层Makefile中导入了.config,所以可以看做是全局的配置项,我们在任何地方都能引用。这一点一定要注意。

根据上面的分析可知,每一层其实都只用管本层的配置项以及下一层Kconfig的导入,下一层如果再有子目录里的Kconfig,那也是下一层Kconfig的事情了,不是你本层Kconfig要管的。按此逻辑依次展开。

↑↑顶层目录

反正都分析到这里了,我们不妨再往上一层,看看顶层Kconfig的内容,按照常理,里面应该是所有下一级目录的导入吧?看看吧

看起来并不是,只是为啥?

并没有导入所有子目录里的Kconfig,而只是导入了arch/$SRCARCH/Kconfig这个目录,其实source引用的是绝对路径,我们可以链接到任意的路径下的Kconfig,只是,我们最终需要将所有需要的Kconfig个贯穿起来。

其中,mainmenu 是主菜单项。它用于定义在图形化配置界面中显示的主菜单名称。当输入“make menuconfig”命令后,打开的默认界面就是由 mainmenu 定义的。

mainmenu 关键字表示这是一个主菜单项,其后引号内的内容 "Linux/$ARCH $KERNELVERSION Kernel Configuration" 则是菜单的名称。其中 $ARCH$KERNELVERSION 是变量,它们会在具体的环境中被替换为相应的值,例如处理器架构(如 ARM)和内核版本(如 5.10.0)。

mainmenu 通常出现在 Kconfig 文件的最顶部,用于设置整个配置界面的主题名称。

这里的配置项会根据我们的配置,然后source不同架构的Kconfig,我们以ARM为例,进去看看ARM架构下的Kconfig,不同的架构需要不同的配置项。

这里面的内容很多

有很多ARM架构需要的配置项以及需要导入的所有目录下的Kconfig

整个逻辑其实是顶层的Kconfig跳到架构下的Kconfig,再跳到各个顶层目录下。

对应的menuconfig 

上面的思路是自底向上来分析的,但实际menuconfig是从顶层自上而下逐层展开的。

OK,我们就顺着这个思路从上到下看看实际menuconfig是不是跟我们上面分析的一样吧。

linux下切到源码顶层,输入make menuconfig,打开menuconfig界面

红框里标题对应着顶层的Kconfig

然后看主页面的菜单

这是从哪开始的?

根据界面标题可知,这里用的是x86的架构,所以,去arch/x86下找到对应的Kconfig

待补充。。。

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

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

相关文章

切换主题的方案

1、link标签动态引入 其做法就是提前准备好几套CSS主题样式文件,在需要的时候,创建link标签动态加载到head标签中,或者是动态改变link标签的href属性 优点:实现了按需加载,提高了首屏加载时的性能 缺点: …

VTK的学习方法-第二类型应用

VTK的高级使用方法是自己写一个算法(Filter),本文使用的数据类型位polydata,这个数据类型应用比较广泛。 我们的算法一般是继承VTK里面的vtkpolydataalgorithm,然后自己添加一些变量,重写(over…

在Ubuntu 20.04 上安装 CoppeliaSim

在 Ubuntu 20.04 上安装 CoppeliaSim Edu V4.6.0 rev18 的步骤如下: 1. 下载安装文件: 首先,确保您已经下载了 CoppeliaSim_Edu_V4_6_0_rev18_Ubuntu20_04.tar.xz 文件。您可以从 Coppelia Robotics 的官方网站下载。 2. 解压缩文件: 打开终端&#…

关于Oracle透明数据加密(TDE)的两个概念

在上一篇文章“Oracle TDE和表空间中的数据量有关系吗?”中,我们证明了加密和解密的时间和表空间内是否有数据没有关系。 本文论证:加密和解密的时间基本相等,如果是Exadata,解密会稍快,因为Exadata支持解…

开发面试题-更新中...

探迹科技(腾讯面试官) 1.了不了解循环屏障 2.对于java中的线程冲突有多少了解(我要算1加到1亿) 3.mysql调优怎么调(我跟他讲了explain) 4.type中ref,range,const的区别 5.我有1亿的数据量&…

京东 北京 java 中级: 哪些情况下的对象会被垃圾回收机制处理掉? 哪些对象可以被看做是 GC Roots 呢?对象不可达,一定会被垃圾收集器回收么?

我同学最近在面试java的岗位, 这是他遇到的某些关于java的JVM中垃圾回收相关的部分的问题, 他来问我, 我特以此文章来解答. 公司 京东 base 北京 面试时间 2024年10月23日16:00:00 他跟我说, 面试官一上来就问了一个关于JVM的问题, 直接就给他难住了, 问题是 : 哪些情况下…

深入理解Qt中的QTableView、Model与Delegate机制

文章目录 显示效果QTableViewModel(模型)Delegate(委托)ITEM控件主函数调用项目下载在Qt中,视图(View)、模型(Model)和委托(Delegate)机制是一种非常强大的架构,它们实现了MVC(模型-视图-控制器)设计模式。这种架构分离了数据存储(模型)、数据展示(视图)和数据操作(委托),使…

通过Python爬虫获取商品销量数据,轻松掌握市场动态

为什么选择Python爬虫? 简洁易用:Python语言具有简洁的语法和丰富的库,使得编写爬虫变得简单高效。强大的库支持:Python拥有强大的爬虫框架(如Scrapy、BeautifulSoup、Requests等),可以快速实现…

【记录】Django数据库的基础操作

数据库连接 在Django中使用 mysqlclient 这个包用于数据库的连接,切换至 Django环境中直接 pip install mysqlclient 安装此包 1 数据库连接配置 在项目目录下的setting.py中配置 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: mini,#数据库名US…

Tips--解决更新resource.qrc之后新的资源无法加载的问题

解决更新resource.qrc之后新的资源无法加载的问题 问题原因解决方法 问题 在使用pyQT或者pyside开发桌面程序的时候&#xff0c;resource.qrc是整合资源文件的地方&#xff0c;如下所示 <!DOCTYPE RCC><RCC version"1.0"> <qresource><file&g…

uniapp修改input中placeholder样式

Uniapp官方提供了两种修改的属性方法&#xff0c;但经过测试&#xff0c;只有 placeholder-class 属性能够生效 <input placeholder"请输入手机验证码" placeholder-class"input-placeholder"/><!-- css --> <style lang"scss" s…

Vue--绑定class样式

有三种方式&#xff1a; 1、字符串写法(freeA) 适用于&#xff1a;样式的类名不确定&#xff0c;需要动态指定 2、数组写法(freeB) 适用于&#xff1a;要绑定的样式个数不确定&#xff0c;名字也不确定 3、对象写法(freeC) 适用于&#xff1a;要绑定的样式个数确定&#xff0c…

Python的买家秀大揭秘:用代码点亮API数据

在一个充满无限可能的数字世界里&#xff0c;Python侦探正准备开始他的新任务&#xff1a;揭开买家秀API数据的神秘面纱。这不仅是一次技术的挑战&#xff0c;更是一次与时间赛跑的较量。Python侦探&#xff0c;这位编程界的福尔摩斯&#xff0c;打开了他的笔记本电脑&#xff…

sealed class-kotlin中的封闭类

在 Kotlin 中&#xff0c;sealed class&#xff08;密封类&#xff09;是一种特殊的类&#xff0c;用于限制继承的类的数量。密封类可以被用来表示一组有限的类型&#xff0c;通常用于状态管理或表达多种可能的错误类型。 密封类用 sealed 关键字定义&#xff0c;这意味着只能…

matlab怎样自动搜索文件夹中的所有txt文件,并将每个txt文件中的数据存放到一个cell数组中——MATLAB批量处理数据

在使用MATLAB批量处理数据时&#xff0c;有时候需要自动搜索文件夹中的所有txt文件&#xff0c;并将每个txt文件中的数据存放到一个以一定规律命名的变量中&#xff0c;以便于后续通过循环处理每个变量数据。 然而&#xff0c;MATLAB并不支持在变量名中直接使用i来动态生成变量…

Unity发送Http

本篇实现在Unity中发送Http请求。 讲解Get&#xff0c;Post&#xff0c;用于在Unity中进行数据对接。 一、Get IEnumerator Get() {string url "";//链接UnityWebRequest request UnityWebRequest.Get(url);//创建UnityWebRequest实例并设置请求方式为Getyield …

Flutter 中的 PopScope 小部件:全面指南

Flutter 中的 PopScope 小部件&#xff1a;全面指南 在 Flutter 应用开发中&#xff0c;导航和路由管理是构建复杂应用时必须面对的挑战之一。PopScope 小部件是 Flutter 2.0 版本引入的一个新功能&#xff0c;它提供了一种更灵活的方式来控制页面的弹出和返回行为。本文将带你…

OpenCV高级图形用户界面(9)更改指定窗口的位置函数moveWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将窗口移动到指定的位置。 cv::moveWindow() 函数用于更改指定窗口的位置。你可以使用这个函数来移动窗口到屏幕上的任何位置。 函数原型 void …

C++大坑之——多继承(菱形继承)

文章目录 前言一、多继承是什么&#xff1f;1. 多继承概念2. 多继承语法 二、菱形继承1. 为什么会有菱形继承问题&#xff1f;2. 代码感受菱形继承3. 虚拟继承1&#xff09;虚拟继承概念及语法2&#xff09;虚拟继承的原理 4. 为什么要有虚基表&#xff1f;5. 为什么要有偏移量…

bootloader跳转app卡死(IAP卡死)

1、 关闭所有中断再跳转APP 一般bootloader跳转到APP时要关闭app中用到的中断(防止中断打断程序的运行&#xff0c;导致程序跑飞&#xff09;&#xff0c;那么查看系统中用到的中断&#xff1a;串口中断、滴答定时器中断&#xff0c;所以&#xff0c;跳转之前要关闭这两个中断&…