kernel 的配置过程和原理

本文详细介绍了Linux内核配置的编译过程,包括成为root用户、执行make distclean、make xxx_defconfig、make menuconfig以及make。同时解析了内核配置的原理,解释了.config文件的重要性,以及menuconfig的使用方法和工作原理。通过对Kconfig文件的分析,揭示了配置项如何影响编译链接过程。

内核的配置编译过程:

进入root用户下操作(以防没有权限):

  1. 使用移植好的内核,解压
  2. 执行make distclean 清理
  3. 打开主makefile文件,确认CROSS_CONPILE路径和自己安装的交叉编译工具一致
CROSS_COMPILE   ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-

确认架构一致

ARCH = arm
  1. 执行make xx_defconfig 生成.config配置文件
    这里使用的是x210ii_qt_defconfig(在arch/arm/configs目录下找一个和自己开发板最接近的)
configuration written to .config

见到这个就成功了

  1. 执行make menuconfig进入界面进行配置(需要先安装ncurses库,执行apt-get install libncurses5-dev安装即可)
  2. 配置完成后执行make,生成/arch/arm/boot/zImage镜像文件

内核的配置原理:

由于内核十分庞大,配置过程复杂,所以分成两步,
第一步:make xxx_defconfig解决的问题是大部分的配置项(这一步结束后大部分配置项就已经正确了)

第二步:对个别不同的针对我们的开发板进行细节调整,细节调整就通过make menuconfig来完成

.config文件:

  • 配置的关键是得到.config文件,这是个隐藏文件,需要ls -a查看
  • .config文件是linux内核在编译过程中很重要的一个文件,其作用类似与uboot中的include/configs/x210_sd.h,内核在编译过程中会读取.config中的配置项,并且用这些配置项去指导整个编译链接过程
  • make x210ii_qt_defconfig生成.config实际上就是
    将x210ii_qt_defconfig文件复制为.config
cp arch/arm/configs/x210ii_qt_defconfig .config
  • arch/arm/configs目录下的这么多个xxx_defconfig都是别人手工配置好适合一定的开发板的.config文件后自己把.config文件保存过去的。我们要做的是挑选最接近自己使用的开发板的那个文件。

menuconfig:
make menuconfig其实就是读取第一步得到的.config,然后给我们一个图形化的界面,让我们可以更加容易的找到自己想要修改的配置项,然后更改配置

使用说明:

  • 键盘按键Y、N、M三个按键的作用分别是将选中模块编入、去除、模块化

  • *表示编入,空白表示去除,M表示模块化

  • /直接查找文件

  • ? 帮助信息

  • [ ]表示支持 Y/N

  • <>表示支持 Y/N/M
    在这里插入图片描述
    menuconfig的工作原理:

  • menuconfig本身由一套软件支持

  • menuconfig读取Kconfig文件,menuconfig本身只提供框架,其中的配置项来自kconfig,内核源码树各个目录下都有Kconfig文件

  • 但是在menuconfig更改后结果保存在.config中

总结:menuconfig菜单项的项目内容从Kconfig文件来,菜单项的选择值从.config文件来,更改后也保存在.config中

kconfig文件详解:

将来在做驱动移植等工作时,有时需要自己添加Kconfig中的一个配置项来将某个设备驱动添加到内核的配置项目中,这时候就需要对Kconfig的配置项格式有所了解

下面是kconfig文件的基本格式:

menuconfig NETDEVICES
	default y if UML
	depends on NET
	bool "Network device support"
	---help---
	 ......

config IFB
	tristate "Intermediate Functional Block support"
	depends on NET_CLS_ACT
	---help---
	 ......

source "drivers/net/arcnet/Kconfig"
  • menuconfig表示菜单(本身属于一个菜单中的项目,但是他又有子菜单项目)、config表示菜单中的一个配置项(本身并没有子菜单下的项目)
  • menuconfig或者config后面的大写字母就是配置项名字,比如NETDEVICES这个字符串前面添加CONFIG_后就构成了.config中的配置项CONFIG_NETDEVICES名字。
  • 一个menuconfig后面跟着的所有config项就是这个menuconfig的子菜单。这就是Kconfig中表示的目录关系
  • 内核源码目录树中每一个Kconfig都会source引入其所有子目录下的Kconfig,从而保证了所有的Kconfig项目都被包含进menuconfig中
  • tristate意思是三态(对应 <>),bool是两态(对应 [ ])
  • depends:表示本配置项依赖于另一个配置项。如果那个依赖的配置项为Y或者M,则本配置项才有意义。支持逻辑操作

Kconfig和.config文件和Makefile三者的关联

  • 配置项被配置成Y、N、M会影响.config文件中的CONFIG_XXX变量的配置值
  • .config中的配置值(=y、=m、=n)会通过makefile影响最终的编译链接过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值