在内核源码树中的每个目录下都存在两个文件:
Kconfig和Makefile
每个Kconfig都代表了其所在目录源文档相关的内核配置菜单
执行make menuconfig时,Kconfig配置菜单被取出来以图形化的方式显示
用户根据自己的需要使用键盘“点完菜”(Y/M/N?)之后保存,就会将用户所需要的”菜“的信息保存到.config这个文件中
主目录里的Makefile调用这个.config文件时就知道用户的选择了

以I2C为例,找到/driver/i2c/kconfig
这个文件包含了所有关于I2C的配置信息,其中就有一下这一段

config I2C_CHARDEV
	tristate "I2C device interface"
	help
	  Say Y here to use i2c-* device files, usually found in the /dev
	  directory on your system.  They make it possible to have user-space
	  programs use the I2C bus.  Information on how to do this is
	  contained in the file <file:Documentation/i2c/dev-interface>.

	  This support is also available as a module.  If so, the module 
	  will be called i2c-dev.

其中tristate指示了这个是个三态的配置选项:
Y — 编译进内核
M — 编译成模块
N — 不编译


应用实例

在drivers目录下创建一个想要添加到内核中的模块
给文件夹起名为my_module_intokernel,里面应该有如下文件:
mydrv.c
mydrc.h
test.c
Kconfig
Makefile

.c和.h为模块功能必要的源文件 test.c用于测试模块的文件
Kconfig里面应该填入如下内容:

menu "MY_DRV_INTOKERNEL"
	comment "MY_DRV_INTOKERNEL"
config CONFIG_MY_DRV_INTOKERNEL
	boolean "MY_DRV support"
	default y
config CONFIG_TEST
	tristate "MY_DRV test support"
	depends on CONFIG_MY_DRV_INTOKERNEL
	default y
endmenu

上面这段脚本应该这么解释:

menuconfig界面里...
配置里应该多一个配置实体,叫MY_DRV_INTOKERNEL
	有实体,不显示怎么行,使用comment显示出来,让用户看到这个选项
配置里还要多个子配置实体,MY_DRV_INTOKERNEL下面还得有个子选项
	他应该是boolean二项的,可以选是或否,叫做"MY_DRV support"
	默认是 y
配置里还要多个子配置实体,MY_DRV support下面还得有个子选项
	他应该是tristate三项的,可以选择Y/N/M,叫做"MY_DRV test support"
	他是有依赖的 不能随便被配置到,一定要上级菜单被配置为Y才行
	默认是 y
这级菜单结束啦!

我们自定义的文件夹下的Kconfig修改完还不够,因为Kconfig是被层级遍历的,上一级目录下的Kconfig还需要配置一下,要不然这里写的还没法起作用。
我们找到driver目录下的Kconfig,可以看到这里面全是 :
在这里插入图片描述
这些source命令 就是他让drivers目录下所有子目录里的Kconfig文件起效果的
所以想让我们自己写的Kconfig起作用,也得照葫芦画瓢:source "drivers/my_drv_intokernel/Kconfig

同样的Makefile也是需要修改的,my_drv_intokernel下的Makefile应该追加:

obj-$(CONFIG_MY_DRV_INTOKERNEL)+=my_drv.o
obj-$(CONFIG_TEST)+=test.o

my_drv_intokernel 父目录下的Makefile还应该追加:

obj-$(MY_DRV_INTOKERNEL)+=my_drv_intokernel /

可以让我们新建的目录能够被编译器注意到,用户在进行编译内核时能够进入到my_drv_intokernel 目录下

配置编译过程中的逻辑

内核根目录及其子目录下都有Makefile,Kconfig,.config文件
Linux还使用了配置命令解释器和配置用户界面(make menuconfig等)
这些元素使得内核配置编译的过程十分科学,使庞大的内核源代码能够有条不紊地被编译完全
在这里插入图片描述
在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐