linux内核配置机制

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/Kconfigdrivers/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文件中

如示例中,MydirverKconfig如下

//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命令即可完成相应构建

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值