手把手教你写Kconfig---基于tiny4412开发板

本文介绍Kconfig的基础概念及其在Linux设备驱动开发中的应用。通过一个简单示例,讲解如何使用Kconfig配置驱动编译选项,并演示如何通过makemenuconfig进行配置。

今天,我就来教大家写写最简单的Kconfig,什么是Kconfig?

我们配置过的信息最终会在这以下的两个文件中找到。


这个文件会被.c包含

include/generated/autoconf.h 

这个autoconf.h中对应的就是一些宏,打开看看就明白了 

这个文件根据.config生成,而.config是根据make menuconfig来进行生成,内核中的makefile包含了这个文件
inlcude/config/auto.conf   


简单的说吧,它是一个Linux驱动的配置文件,配置什么东西呢?在linux设备驱动中,我们写的驱动程序最终会加入到内核的Makefile中进行编译,那么具体要编译成什么呢?要编译成.o文件还是.ko文件,还是不编译?

由那个命令来进行配置呢?

那就是make menuconfig

在这个menuconfig中,有很多菜单,其实,那些就是通过Kconfig一个一个加进去的。

如图所示:


那么如何来写这样的一个配置选项呢?

我还是以上一节手把手教大家学第一个例程,在其中添加一个Kconfig来进行说明。

在linux内核源代码drivers目录下创建一个4412_driver的目录:

然后进到这个目录下,创建hello_kernel.c ,  Makefile , Kconfig 这三个文件。

hello_kernel.c代码如下:

#include <linux/kernel.h>
#include <linux/module.h>

static int __init hello_init(void)
{
    printk("Hello, kenerl installed !\n");
    return 0;
}

static void __exit hello_cleanup(void)
{
    printk("Good-bye, removed!\n");
}

module_init(hello_init);
module_exit(hello_cleanup);

MODULE_LICENSE("GPL");
Makefile如下:

obj-$(CONFIG_HELLO_KERNEL) += hello_kernel.o

Kconfig如下:

menu "4412_driver"
     config HELLO_KERNEL
          bool "hello_kernel"
          default n
  	  help
	  if you select , you can use it

endmenu
这里要说说参数,menu是什么?menu就是只这个配置选项中的菜单:

config表示要配置的参数

bool表示提示配置这个选项

default表示默认配置,有y,n,后面还会有模块

help表示帮助,help下面的字符串表示提示的信息,可以自由添加

配置最终结果如图所示:

我们回车进去,看到:

这时候我们按下空格键就打上*会对这个我们刚刚写的驱动进行配置,配置完毕,我们就可以开始编译linux内核了;

编译中,我们看到内核已经将我们的选项进行了配置:

编译完成,将在arch/arm/boot/zImage这个内核镜像下载入开发板:

然后启动开发板,就可以在串口中看到打印信息了:

我们在这里看到,3.670133秒的时候,打印了Hello,kernel  installed ! 也就是.c文件里的字符串。

关于Kconfig配置还有很多,说到底也不用去记,因为内核中有很多个Kconfig,我们可以打开看看去多尝试尝试,然后make menuconfig去看看效果,根据需求去配置就可以了。




Kconfig-Mconfig 是 Linux 内核配置系统的重要组成部分,用于管理内核配置选项。它通过一系列的配置文件和工具来帮助开发者生成最终的 `.config` 文件,该文件决定了内核中启用的功能和模块。以下是关于 Kconfig-Mconfig 的使用及其在内核配置中的作用的详细说明: ### Kconfig-Mconfig 的基本用途 Kconfig-Mconfig 是一组用于处理内核配置的脚本和工具,主要用于解析和合并多个配置文件,生成最终的 `.config` 文件。它支持多种操作模式,包括保存默认配置、合并多个配置文件等。 #### 保存默认配置 在 U-Boot 或 Linux 内核开发中,`make savedefconfig` 是一个常用的命令,用于将当前的 `.config` 文件保存为 `defconfig` 文件。这个命令会调用 `scripts/kconfig/conf` 工具,并将当前的配置保存为 `defconfig` 文件,以便后续使用。例如: ```bash make savedefconfig ``` 这将生成一个 `defconfig` 文件,其中包含了当前配置的所有选项[^1]。 #### 合并多个配置文件 当需要将多个小的配置文件合并到一个主配置文件中时,可以使用 `merge_config.sh` 脚本。这个脚本位于 `scripts/kconfig/` 目录下,支持多个配置文件的合并,并生成最终的 `.config` 文件。例如: ```bash mkdir build ${PWD}/msm-5.4/scripts/kconfig/merge_config.sh -m -r -O build msm-5.4/arch/arm64/configs/vendor/lahaina-qgki-debug_defconfig configs_files/overlayfs.cfg configs_files/systemd.cfg ... ``` 这条命令会将多个配置文件合并,并生成一个最终的 `.config` 文件,适用于特定的硬件平台或功能需求[^2]。 ### Kconfig-Mconfig 的配置管理 Kconfig-Mconfig 的核心在于其配置管理能力,允许开发者通过简单的文本文件来定义和管理复杂的配置选项。每个配置选项通常以 `config` 关键字开头,后面跟随一个布尔值(`bool`)或其他类型的定义。例如: ```kconfig config MODVERSIONS bool "Set version information on all module symbols" depends on MODULES help Usually, modules have to be recompiled whenever you switch to a new kernel. ``` 这个配置选项 `MODVERSIONS` 定义了一个布尔值,表示是否为所有模块符号设置版本信息。它依赖于 `MODULES` 选项,并提供了帮助信息,说明模块通常需要在切换内核时重新编译[^3]。 ### Kconfig-Mconfig 的高级使用 除了基本的配置管理和合并功能外,Kconfig-Mconfig 还支持更高级的使用场景,如条件编译、依赖关系管理等。这些功能使得内核配置更灵活和强大。 #### 条件编译 通过使用 `if` 和 `endif` 指令,可以在配置文件中实现条件编译。例如: ```kconfig if ARM64 config ARM_NEON bool "Enable NEON support" default y endif ``` 这段代码表示只有在 `ARM64` 架构下,`ARM_NEON` 选项才会被启用。 #### 依赖关系管理 Kconfig-Mconfig 支持复杂的依赖关系管理,确保某些配置选项只有在其他选项启用时才可用。例如: ```kconfig config MODULES bool "Enable loadable module support" default y config MODVERSIONS bool "Set version information on all module symbols" depends on MODULES ``` 这里,`MODVERSIONS` 选项只有在 `MODULES` 选项启用时才可用。 ### 示例代码 以下是一个简单的 Kconfig 文件示例,展示了如何定义和管理配置选项: ```kconfig menu "Example configuration" config EXAMPLE_FEATURE bool "Enable example feature" default n help This is an example feature that can be enabled or disabled. if EXAMPLE_FEATURE config EXAMPLE_SUBFEATURE bool "Enable sub-feature of example feature" default y help This is a sub-feature that depends on the main example feature. endif endmenu ``` 这个 Kconfig 文件定义了一个菜单项,包含两个配置选项:`EXAMPLE_FEATURE` 和 `EXAMPLE_SUBFEATURE`。后者只有在前者启用时才可用。 ### 总结 Kconfig-Mconfig 是 Linux 内核配置系统的核心工具之一,提供了强大的配置管理能力。通过 `make savedefconfig` 和 `merge_config.sh` 等命令,开发者可以轻松地生成和管理内核配置文件。此外,Kconfig-Mconfig 还支持条件编译和依赖关系管理,使得内核配置更灵活和强大。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Engineer-Bruce_Yang

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值