U-Boot学习(3):.config、defconfig文件对比及图形化配置Kconfig

在上一节中,我们介绍了U-Boot编译和.config配置文件生成分析,我们可以通过make xxx__defconfig来进行一些配置,其中xxx__defconfig对应config目录下的基于不同开发板的一些配置,指令执行完后会根据对应的配置在根目录下生成一个.config配置文件。而这个配置文件也可以通过图形化配置页面来生成,这一节就来介绍一下。

文章目录

  • 1 xxx_defconfig和.config文件
    • 1.1 文件对比
    • 1.2 总结
  • 2 图形化配置之Kconfig
    • 2.1 介绍
    • 2.1 U-Boot的图形配置
  • 3 .config中的配置是如何使用的

1 xxx_defconfig和.config文件

1.1 文件对比

1、imx6ul_isiot_emmc_defconfig及其对应.config对比

我们对比一下两个文件,左边是imx6ul_isiot_emmc_defconfig文件,右边是make imx6ul_isiot_emmc_defconfig生成的.config文件,可以看到配置文件里有的,.config文件里都有,除此之外.config文件里还有一些其它的配置。

  • 文件中#开头的为注释

在这里插入图片描述

2、imx6ul_isiot_emmc_defconfigimx6ul_isiot_nand_defconfig对比

这里找一个与imx6ul_isiot_emmc_defconfig类似的配置imx6ul_isiot_nand_defconfig,来看一下区别:

在这里插入图片描述

可以看到,如果要使能NAND的话,需要多定义几个宏定义。

3、nand的.config和emmc的.config对比

左边是nand的.config,右边是emmc的.config

在这里插入图片描述

可以看出,比如nand的一行CONFIG_MTD_RAW_NAND=y,生成出来后可能对应了多个与此相关的配置。

1.2 总结

1、xxx_defconfig

在U-Boot的defconfig文件中,配置项之间存在依赖关系。当你在defconfig文件中启用或禁用某个配置项时,可能会触发相关的配置项引申或取消。

  1. 直接依赖关系:defconfig文件中,一些配置项可能有直接的依赖关系。这意味着启用或禁用一个配置项可能会导致与之直接相关的其他配置项的状态发生变化。这通常是通过配置项的名称来指定的。
  2. 间接依赖关系: 有些配置项可能存在间接的依赖关系。这意味着启用或禁用一个配置项可能会触发一系列的配置项状态变化,这些变化可能是由于其他配置项的依赖关系而产生的。

所以在生成的.config文件中,xxx_defconfig的一项配置可能有与之相关的多个配置。

2、.config

.config文件是一个文本文件,包含了一系列的宏定义,用于指定U-Boot的构建选项。这些宏定义决定了编译过程中使用的各种配置,如开启或关闭某个功能、指定交叉编译工具链的路径等。例如,在C代码中可以使用类似以下的方式来检查某个配置是否被定义:

#ifdef CONFIG_MY_FEATURE// 这段代码只有在 CONFIG_MY_FEATURE 被定义时才会被编译
#endif

2 图形化配置之Kconfig

2.1 介绍

Kconfig(Kernel Configuration)是Linux内核中用于配置构建选项的工具之一。它允许开发者通过一个文本界面或图形界面来选择、配置和调整内核的各种功能和模块。Kconfig文件包含了内核的配置信息,这些信息指定了内核编译时的各种选项,如支持的硬件、文件系统、网络协议等。

以下是Kconfig的一些主要特点和用法:

  1. 配置系统的基本原理: Kconfig采用了一种树状结构的配置系统。用户可以通过选择配置项,打开或关闭功能、模块或驱动,以满足特定需求。
  2. 配置文件: Kconfig的配置信息存储在内核源代码树中的Kconfig文件中。每个子目录都可以包含一个Kconfig文件,用于配置该目录下的源代码。
  3. 菜单配置界面: Kconfig提供了一个文本界面,也可以通过图形界面工具(如menuconfignconfigxconfig等)进行配置。这些工具允许用户在配置过程中浏览选项,选择开启或关闭功能,并设置相应的参数。
  4. 依赖关系: Kconfig支持配置项之间的依赖关系。某些功能可能依赖于其他功能的开启或关闭,Kconfig会确保用户不能选择不合理的配置。
  5. 自动生成配置: Kconfig支持自动检测系统硬件和软件环境,从而生成适用于当前系统的默认配置。这有助于简化配置过程。
  6. 配置文件生成: 在用户完成配置后,Kconfig会生成一个.config文件,其中包含了用户选择的所有配置信息。这个文件将用于实际的内核编译过程。
  7. make命令: 用户可以使用make menuconfigmake nconfig等命令来启动配置工具。在配置完成后,使用make命令即可开始内核的编译过程。

make menuconfig是Linux内核编译中使用的一个命令,它打开一个文本菜单界面,允许用户配置内核的各种选项。在执行make menuconfig之前,相关的文件主要包括:

  1. Kconfig文件: Kconfig文件包含了内核的配置信息,以树状结构的形式组织。每个功能、模块或驱动都有对应的Kconfig条目。这些文件通常位于内核源代码树的各个目录中,例如,arch/目录、drivers/目录等。make menuconfig通过这些文件构建菜单界面。
  2. Makefile: 内核源代码中的Makefile包含了编译内核的相关规则和指令。make menuconfig命令会使用Makefile中的规则来创建配置菜单并执行相应的操作。
  3. .config文件: 在用户使用make menuconfig过程中,配置的结果会保存在一个名为.config的文件中。这个文件包含了用户在配置过程中所做的选择,即内核的具体配置。.config文件将在后续的编译过程中被使用。

执行make menuconfig后,系统会读取Kconfig文件和已经存在的.config文件,然后在终端中打开一个菜单,用户可以在菜单中选择和配置不同的内核功能。选择保存并退出后,配置的结果会被写入.config文件中。

虽然Kconfig是设计用来配置Linux内核的工具,但是U-Boot也使用了这个图形工具。使用这个图形化工具需要安装libncurses-dev库:

sudo apt-get install libncurses-dev

2.1 U-Boot的图形配置

我们直接使用make menuconfig就可以打开图形配置界面了,在上一节中我们已经修改了Makefile指定了CROSS_COMPILE,如果没有指定的话需要指定这个变量:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

如下图所示:
在这里插入图片描述
如上面的提示,输入Y可以将某个功能编译进U-Boot源码,输入N则是取消编译,输入M则是将功能编译成模块。

比如我们进入下面的Command Line Interface,这个界面就是用来配置U-Boot命令行中支持的指令:
在这里插入图片描述
我们进去Memory commands看一下:
在这里插入图片描述
我们可以通过按下YN来使能和取消某些不需要支持的指令。所有的选项配置完之后选择下面的Save即可保存配置到.config中。

实际上这些配置都对应代码中的宏定义,我们可以根据我们的需求打开或关闭一些功能,从而实现U-Boot的裁剪。当然如果有必要的话,还是建议把每一个配置项都理解一遍。

3 .config中的配置是如何使用的

.config 文件通常不是直接包含在代码中的头文件(.h 文件)中。它是通过Makefile中的一些规则和变量传递给预处理器的。

U-Boot的Makefile通常会包含一个名为config.mk的文件,这个文件会包含.config文件的内容并将其转换为Makefile变量。通过这种方式,Makefile 中的规则可以使用这些变量,将它们传递给编译器进行条件编译。

下面举一个简单的例子说明U-Boot的Makefile中如何处理.config文件:

# Makefile# Include the configuration file
-include config.mk# Compiler flags
CFLAGS += -Wall# Conditional compilation based on configuration options
ifeq ($(CONFIG_FEATURE_A),y)CFLAGS += -DFEATURE_A_ENABLED
endififeq ($(CONFIG_FEATURE_B),y)CFLAGS += -DFEATURE_B_ENABLED
endif# Target rule
all: my_programmy_program: some_code.c$(CC) $(CFLAGS) $^ -o $@
  • -include config.mk用于包含config.mk文件,该文件会根据.config文件的内容生成相应的变量。
  • ifeq ($(CONFIG_FEATURE_A),y)ifeq ($(CONFIG_FEATURE_B),y)用于检查配置文件中的选项是否为 y(启用),如果是,则在CFLAGS变量中添加相应的编译选项。

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

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

相关文章

排序算法6---快速排序(非递归)(C)

回顾递归的快速排序,都是先找到key中间值,然后递归左区间,右区间。 那么是否可以实现非递归的快排呢?答案是对的,这里需要借助数据结构的栈。将右区间左区间压栈(后进先出),然后取出…

详细讲解Python连接Mysql的基本操作

目录 前言1. mysql.connector2. pymysql 前言 连接Mysql一般有几种方法,主要讲解mysql.connector以及pymysql的连接 后续如果用到其他库还会持续总结! 对于数据库中的表格,本人设计如下:(为了配合下面的操作) 1. mysql.connector mysql.connector 是一…

C#,入门教程(19)——循环语句(for,while,foreach)的基础知识

上一篇: C#,入门教程(18)——分支语句(switch-case)的基础知识https://blog.csdn.net/beijinghorn/article/details/124039953 一、for循环 当老师进入教室,从门口开始分别按行、列点名,看看哪位翘课&…

Xcode15 升级问题记录

这里写自定义目录标题 新版本Xcode15升级问题1:rsync error: some files could not be transferred (code 23) at ...参考 新版本Xcode15升级 下载地址:https://developer.apple.com/download/all/ 我目前使用的版本是Xcode15.2 我新创建了一个项目&…

transfomer中Decoder和Encoder的base_layer的源码实现

简介 Encoder和Decoder共同组成transfomer,分别对应图中左右浅绿色框内的部分. Encoder: 目的:将输入的特征图转换为一系列自注意力的输出。 工作原理:首先,通过卷积神经网络(CNN)提取输入图像的特征。然…

开发需求总结9-el-tree获取选中节点,节点全选时返回被全选子级的父节点,未全选则返回被选中的节点

目录 需求描述 代码实现: 需求描述 需要获取树组件选中的节点,假如父节点被选中(该节点全选),即只返回父节点的数据,如父节点未被全选,则正常返回被选中节点的数据。 示例一: 如上图…

Python展示 RGB立方体的二维切面视图

代码实现 import numpy as np import matplotlib.pyplot as plt# 生成 24-bit 全彩 RGB 立方体 def generate_rgb_cube():# 初始化一个 256x256x256 的三维数组rgb_cube np.zeros((256, 256, 256, 3), dtypenp.uint8)# 填充立方体for r in range(256):for g in range(256):fo…

编曲混音FL Studio21.2对电脑有什么配置要求

FL Studio 21是一款非常流行的音乐制作软件,它可以帮助音乐人和制作人创作出高质量的音乐作品。然而,为了保证软件的稳定性和流畅性,用户需要知道FL Studio 21对电脑的配置要求。本文将介绍FL Studio 21的配置要求,以帮助用户选择…

32 二叉树的定义

之前的通用树结构 采用双亲孩子表示法模型 孩子兄弟表示法模型 引出二叉树 二叉树的定义: 满二叉树和完全二叉树 对此图要有印象 满二叉树一定是完全二叉树,但是完全二叉树不一定是满二叉树 小结

RabbitMQ交换机(2)-Direct

1.Direct 直连(路由)交换机,生产者将消息发送到交换机,并指定消息的Routing Key(路由键)。交换机会将Routing Key与队列绑定进行匹配,如果匹配成功,则将该消息路由到对应的队列中。如果没有匹配成功,该消息…

小程序中使用微信同声传译插件实现语音识别、语音合成、文本翻译功能----语音识别(一)

官方文档链接:https://mp.weixin.qq.com/wxopen/plugindevdoc?appidwx069ba97219f66d99&token370941954&langzh_CN#- 要使用插件需要先在小程序管理后台的设置->第三方设置->插件管理中添加插件,目前该插件仅认证后的小程序。 语音识别…

JS | JS调用EXE

JS | JS调用EXE 网上洋洋洒洒一大堆文章提供,然我还是没找打合适的方案: 注册表方案做了如下测试(可行但是不推荐?): 先,键入文件名为 myprotocal.reg 的注册表,并键入一下信息: Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\openExe] //协议名…

Redis相关命令详解及其原理

Redis概念 Redis,英文全称是remote dictionary service,也就是远程字典服务。这是kv存储数据库。Redis,包括所有的数据库,都是请求-回应模式,通俗来说就是数据库不会主动地要给前台推送数据,只有前台发送了…

MySQL/Oracle 的 字符串拼接

目录 MySQL、Oracle 的 字符串拼接1、MySQL 的字符串拼接1.1 CONCAT(str1,str2,...) : 可以拼接多个字符串1.2 CONCAT_WS(separator,str1,str2,...) : 指定分隔符拼接多个字符串1.3 GROUP_CONCAT(expr) : 聚合函数,用于将多行的值连接成一个字符串。 2、Oracle 的字…

广州市生物医药及高端医疗器械产业链大会暨联盟会员大会召开,天空卫士数据安全备受关注

12月20日,广州市生物医药及高端医疗器械产业链大会暨联盟会员大会在广州举办。在本次会议上,作为大会唯一受邀参加主题分享的技术供应商,天空卫士南区技术总监黄军发表《生物制药企业如何保护数据安全》的主题演讲。 做好承上启下“连心桥”…

C++设计模式-- 2.代理模式 和 外观模式

文章目录 代理模式外观模式角色和职责代码演示一:代码演示二:外观模式适用场景 代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合 或不能直接引用另一个对象,而代…

【实战记录】 vagrant+virtualbox+docker 轻松用虚拟机集成组件

用途 最近要学一大堆组件,不想直接安装本机上,然后gpt说:你可以用vagrant起个虚拟机(然后docker拉取各种组件的镜像);或者k8s 实战的整体思路 首先安装virtualbox和vagrant。然后cmd依次键入三条命令 安…

无需编程,简单易上手的家具小程序搭建方法分享

想要开设一家家具店的小程序吗?现在,我将为大家介绍如何使用乔拓云平台搭建一个家具小程序,帮助您方便快捷地开展线上家具销售业务。 第一步,登录乔拓云平台进入商城后台管理页面。 第二步,在乔拓云平台的后台管理页面…

云畅科技技术中心被认定为湖南省省级企业技术中心

近日,湖南省工业和信息化厅公布《2023年第二批湖南省省级企业技术中心(第29批)》,云畅科技技术中心作为研发设计型代表入选。 省级企业技术中心是强化企业技术创新主体地位,增强企业自主创新能力,推动工业企业高质量发展的一个重要…

深圳三维扫描分析/偏差检测模具型腔三维尺寸及形位偏差测量公司

CASAIM中科广电三维扫描模具型腔深圳案例: 模具型腔的三维扫描分析/偏差检测是一项重要的质量控制过程,旨在确保模具制造过程中的精确度和一致性。 CASAIM中科广电通过使用高精度的三维扫描设备,可以获取模具型腔的实际形状和尺寸数据&…