文章目录
linux内核配置机制
通过将驱动放在内核源代码树中案例分析内核配置
1、配置的基本结构
- Makefile:分布在
Linux kernel
根及各级目录下,定义了Linux kernel
的编译规则 - 配置文件:
.config
- 配置工具:
makemenuconfig
2、为什么需要配置
当我们为了适应不同的平台,需要裁剪不同的内核,其中配置就可以选择我们需要的内核项,我们可以从以下两个方向进行分析
2.1、从Makefile
功能:
- 静态编译(直接编译进内核)
- 动态编译(作为模块编进内核)
直接应用:
- Makefile需要读取配置文件
/kernel/include/generated/autoconf.h
2.2、从内核源码
功能:
- 静态编译(直接编译进内核)
- 动态编译(作为模块编进内核)
直接应用:
- 从
/kernel/include/generated/autoconf.h
头文件读取条件编译的宏
3、makeconfig过程详解
kernel/scripts
存放了make menuconfig
配置界面图形绘制的源文件
3.1、生成菜单界面
读取 kernel/arch/$ARCH/
下的Kconfig
文件生成配置界面选项
其中
$ARCH
为环境变量,在kernel/Makefile
文件中定义
示例使用I6E环境搭建,其环境变量信息如下:
declare -x ARCH="arm"
declare -x CROSS_COMPILE="arm-linux-gnueabihf-"
make infinity6e_ssc012b_s01a_spinand_defconfig
3.2、读取默认菜单配置
通常在
kernel/arch/$ARCH/configs
文件夹中会存放一些默认的配置文件
make menuconfig
默认从kernel/
目录下读取.config
文件中读取配置文件,如果更换了平台,可以从kernel/arch/$ARCH/configs
中复制对应的默认配置到kernel/.config
文件中
自此make menuconfig
已经可以正常的读取和配置界面了
3.3、与Makefile链接
当保存make menuconfig
时,系统除了会自动的更新.config
以外,还会将所有的选项以宏的方式保存在kernel/include/generated/autoconf.h
文件中
内核源码会包含这个头文件,根据宏进行条件编译
4、驱动放在内核源代码树中案例分析
4.1、生成菜单界面
源文件我们选择放在kernel/drivers/char/
目录下,新建的Mydriver
目录中
xavier.xie@:~/ALKaid/kernel/drivers/char/Mydriver$ ls
cdevdri.c Kconfig Makefile
其中菜单界面我们已经知道是从kernel/arch/arm/Kconfig
文件开始调用,在文件中可以查到它的调用轨迹
//kernel/arch/arm/Kconfig
source "drivers/Kconfig"
//->kernel/drivers/Kconfig
source "drivers/char/Kconfig"
//->kernel/drivers/char/Kconfig
source "drivers/char/Mydriver/Kconfig"
//->drivers/char/Mydriver/Kconfig
config CDEVDIR
tristate "Hello dirver"
default y
其中source
关键字
用法:source
相当与C语言的include
关键字,等同于将filename
文件内容复制到当前位置
tristate
关键字
用法:tristate “string”
三态,Y:可以编进内核,N:不编译,M:做模块编译
其中string
是该选项的名称
default
关键字
用法:default X
三态,X可选Y/N/M,为该选项的默认选择,选项意义同上
当kernel/.config
文件读取不到该选项的配置时,就会去对应的Kbuild
下读取default
值
经过层层调度,从arch/arm/Kconfig
到drivers/char/Mydriver/Kconfig
,读取到了菜单的构造,生成菜单选项
4.2、读取默认菜单选项
当生成了菜单选项后,
Kbuild
机制还需要一个默认的配置选择
在kernel/.config
文件中保存着默认配置,该文件可以自动/手动生成
- 自动生成
启动make menuconfig
通过选择选项,保存退出后,就会自动更新kernel/.config
文件
- 手动生成
从对应的平台默认配置文件kernel/arch/arm/configs
选择infinity6e_ssc012b_s01a_spinand_defconfig
文件
执行以下命令
make infinity6e_ssc012b_s01a_spinand_defconfig
这样kernel/.config
就已经被infinity6e_ssc012b_s01a_spinand_defconfig
文件覆盖了
4.3、与makefile链接
当执行以上两步后,已经可以正常的配置好图形界面了,接下来要跟makefile链接起来,达到对应的条件编译效果
启动make menuconfig
通过选择选项,保存退出后,实际上将drivers/char/Mydriver/Kconfig
文件中的CDEVDIR
加上前缀CONFIG_
变成CONFIG_CDEVDIR
宏加入/kernel/.config
文件中
如示例中,Mydirver
的Kconfig
如下
//drivers/char/Mydriver/Kconfig
config CDEVDIR
tristate "Hello dirver"
default y
//kernel/.config
CONFIG_CDEVDIR y
执行make
指令时,就会将/kernel/.config
中的宏分别更新到
/kernel/include/generated/autoconf.h
供内核源码调用
/kernel/include/config/auto.conf
供
/kernel/Makefile
调用,eg:CONFIG_CDEVDRI
//kernel/Makefile
-include include/config/auto.conf
//Kernel/drivers/char/Makefile
obj-$(CONFIG_CDEVDRI) += Mydriver/
//Kernel/drivers/char/Mydriver
obj-$(CONFIG_CDEVDRI) += cdevdri.o
对目录对象Mydriver/
来说,只判断是否编译,不判断按哪种方式编译,对cdevdri.o
对象,不仅判断是否编译,还要判断按哪种方式编译
如此在Kernel
下执行make config
后构建相关参数宏,直接使用make
命令即可完成相应构建