linux下Kconfig与.config和Makefile详解

一.linux内核中Makefile、Kconfig、.config的关系

(1)三者的作用

Makefile:一个文本形式的文件,编译源文件的方法。

Kconfig:一个文本形式的文件,内核的配置菜单。

.config:编译所依据的配置
(2)三者的关系
简单来说就是去饭店点菜:Kconfig是菜单,Makefile是做法,.config就是你点的菜。在运行make menuconfig后在配置界面中出现的就是Kconfig中的选项,在界面中看到的已经配置好的选项就是从.config中读取出来的,当配置完成后就会将配置重新保存到.config中,编译时makefile会读取.config中配置来对内核进行编译。
注意事项:
(a)如果.config不存在,运行make config/menuconfig时的缺省设置由固化在各个Kconfig文件中各项目的缺省值决定。
(b)如果.config存在,运行make config/menuconfig时的缺省设置即是当前.config的设置,若对设置进行了修改,.config将被更新。
©arch/arm/defconfig是一个缺省的配置文件,make defconfig时会根据这个文件生成当前的.config。
(d)arch/arm/configs文件夹中有许多命名为xxx_defconfig的配置文件,如果运行make xxx_defconfig,当前.config文件会由xxx_defconfig文件生成。
(e)make oldconfig的作用是备份当前.config文件为.config.old,如若make config/menuconfig设置不当可用于恢复先前的.config。

二.linux内核中Makefile、Kconfig、.config的使用方法

(1)Kconfig的使用方法
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

bool/tristate/int/hex/string
值类型,只有配置选项有值类型。包括: bool——值为y或n、 tristate——值为y或m或n、string——值为字符串、int——值为十进制整数、 hex——值为十六进制整数

prompt “提示字符串” [if expr ]
输入提示:每个菜单入口最多只能有一个展示给用户看的输入提示,可以使用“if”来表示输入提示的依赖性,这个依赖性是可选的。

default expr [if expr]
默认值:一个配置选项可以有任意多个默认值,但只有第一个有效的。当输入提示是可见时,才能看到默认值,并且可以输入一个值将默认值覆盖。与输入提示一样,可以使用“if”来表示默认值的依赖性,这个依赖性是可选的。

def_bool/def_tristate expr [“if” expr]
值类型+默认值:说明值类型时同时说明默认值。可以使用“if”来表示默认值的依赖性,这个依赖性是可选的。

requires(或depends on)expr,
依赖: 依赖项给菜单入口或配置项定义了一个依赖规则,只有当expr为真或被选中时,该菜单入口或配置项才有效,依赖对菜单入口或配置项中的其它属性都有效。

select symbol [“if” expr]
反向依赖:当前配置项被选中时,选中symbol,忽略依赖项和手动设置值。只有boolean和tristate类型的symbol可以使用反向依赖。

imply symbol [if expr]
弱反向依赖:当前配置项被选中时,选中symbol,但是symbol仍然可由依赖或者手动配置为n。

range value1 value2 ["if"expr],
值范围:限定int和hex类型symbol的输入值。用户只能输入一个大于等于第一个symbol的值,并且小于等于第二个symbol的值。

visible if expr
只能用于menu/endmenu中,当expr为真时菜单可见。

—help—/help
帮助:定义了一个帮助文本。帮助文本的结尾是根据缩进级别来决定的,这就意味着如果帮助文本中某一行相对于第一行有更小的缩进,那么这一行就是帮助文档的最后一行。”—help—”和“help”在使用功能上没有区别,”—help—”是用来作为对开发者的一种提示,它显式区别于文档中的配置选项“help”。

option symbol[=value]
其它属性:各种不常见的选项的通过这个选项来定义,比如修改菜单入口的行为和配置symbol。下面这些配置当前是允许的:

defconfig_list
定义了一系列默认入口,当使用默认配置时可以从这里寻找(当主.config文件不存在时会使用默认配置)
modules
声明了一个symbol将被当做MODULES symbol,MODULES symbol是所有配置symbol的第三种模块化状态。
env=value,
导入了一个环境变量到Kconfig中。环境变量就像是Kconfig中的一个默认值,但是它是从外部环境中导入的。正因为它从外部环境导入,所以赋值的这个时候它相对于正常的默认值来说是没有定义的。这个symbol当前没有导出到构建环境中(如果想要这样的话,可以通过另一个symbol导出)
allnoconfig_y
声明symol默认值为y。
*补充:

值类型后可以紧跟一个输入提示(也可以单独使用一个提示属性),所以下面的这两个例子是等价的:
bool “Networking support”
#和
bool
prompt “Networking support”
依赖对菜单入口中的其它属性都有效,下面两种写法是等价的
bool"foo" if BAR
default y if BAR
#和
depends on BAR
bool “foo”
default y
并非每个菜单入口或者配置项都具有所有的属性。
限制一个配置项只能编译为模块或不选择。
config FOO
dependson m
限制一个配置项只能编译或模块化
config FOO
tristate “foo”
select FOO if m
default m
如果一个配置项只有值类型属性,则它的选中只能通过其他配置项的select属性
菜单选项
主菜单——最顶层的菜单
mainmenu “主菜单名字”
多选菜单——带配置项但本身不可配置。它的属性只能是依赖项和可见性。
menu “string”
… …
endmenu
可选菜单——带配置项且本身是配置项。配置关键字前面添加CONFIG_后就构成了“.config”文件中的配置项名字。
menuconfig 配置关键字
… …
config——配置项,配置关键字前面添加CONFIG_后就构成了“.config”文件中的配置项名字,但不是配置界面显示的字符,配置界面显示的是提示字符。
config 配置关键字
… …
单选菜单,单选菜单只能是bool类型或tristate类型 ,并且布尔选择只允许一个单一的配置项被选中,三态选择还允许任何配置项被设置为“M”。这可以用在下面的情况:如果一个硬件存在多个驱动程序,并且只有一个驱动程序可以编译/加载到内核中,但所有的驱动程序可以编译成模块。
choice
… …
endchoice
注释,这定义了一条在用户配置过程中显示的注释,同时会写入导出文件。它的属性只有依赖项。
comment
条件——当expr为真或选中时,中间的内容才有效。
if expr
… …
endif
引入其他Kconfig文件,方便菜单嵌套。
source “…dir/Kconfig”
(2).config的使用方法
.config中的配置选项就是Kconfig中config后面的字符串加CONFIG_.
比如:上图中CONFIG_TEST_test。
.config的修改方法:
make menuconfig
make xxx_defconfig
直接修改
注意:
注意如果直接修改,不一定会生效,因为一些配置可能存在依赖关系,make的时候会根据依赖关系,进行规则的检查,不推荐直接在.config进行修改。
(3)Makefile的使用方法
直接编译:
obj-y += hello.o
表示要由hello.c或者hello.s文件编译得到hello.o并链接进内核
而更常见的做法是根据.config文件的CONFIG_ 变量来决定文件的编译方式 :
条件编译:
obj-$(CONFIG_HELLO) += hello.o
obj-m则表示该文件要作为模块编译。
除了y,m以外的obj-x形式的目标都不会被编译。

三.linux内核中添加模块

(1)将代码拷贝到Linux内核代码恰当的地方
(2)新建或者修改对应的kconfig文件
(3)新建或修改对应的makefile文件
(4)修改上一级目录下的Kconfig与makefile
(5)运行make menuconfig来配置内核生成新的.config文件
(6)编译内核运行内核

  • 12
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值