系统移植(十)Linux内核源码解析

一、分析make <board_name>_defconfig执行过程详解

1. 打开linux内核源码目录下的Makefile,搜索“%config”字符串,得到以下结果

 %config: scripts_basic outputmakefile FORCE
 $(Q)$(MAKE) $(build)=scripts/kconfig $@

解析以上命令:
$@ : 目标
$^ : 所有的依赖
$< : 第一个依赖

命令展开之后的结果:
@make -f ./scripts/Makefile.build obj=scripts/kconfig fsmp1a_defconfig

使用scripts/Makefile.build文件作为Makefile文件,来执行make fsmp1a_defconfig命令,同时传递参数 obj=scripts/kconfig
在这里插入图片描述

2. 打开linux内核源码目录下的./scripts/Makefile.build,查找“config”目标

在此文件下搜索config目标,但是没有找到对应的目标,因此推测可能是通过include包含了其它目录下的Makefile文件。

可以看到文件中有如下信息:
在这里插入图片描述

 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
 kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
 include $(kbuild-file)

以上命令展开之后的结果:include scripts/kconfig/Makefile

此命令具体如何展开,参见u-boot源码分析

3. 打开linux内核源码中的scripts/kconfig/Makefile文件,搜索“%_defconfig”字符串,

得到以下结果:

%_defconfig: $(obj)/conf 
    $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

前述已经得知,$(Q)是@,即取消命令在中断回显。
因此将命令前边的$(Q)删除,然后重新执行make fsmp1a_defconfig
命令,查看终端回显的结果,如下所示:
scripts/kconfig/conf --defconfig=arch/arm/configs/fsmp1a_defconfig Kconfig

使用file命令可查看scripts/kconfig/conf文件是一个x86格式的ELF可执行文件
在这里插入图片描述

以上命令最终执行的效果:
conf程序解析arch/arm/configs/目录下fsmp1a_defconfig和linux内核源码目录下的Kconfig文件,最终在u-boot源码目录下生成.config配置文件,.config文件给Makefile文件使用,Makefile文件根据.config文件中的信息最终决定了linux内核源码中的哪些文件被编译,哪些文件不被编译。

二、分析make menuconfig执行过程详解

1. 分析Makefile文件,分析Makefile文件的规则中目标为"menuconfig"

打开u-boot源码目录下的Makefile,搜索“%config”字符串,得到以下结果

%config: scripts_basic outputmakefile FORCE
    $(Q)$(MAKE) $(build)=scripts/kconfig $@

命令展开之后的结果:
@make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig

2. 打开linux内核源码目录下的./scripts/Makefile.build,查找“menuconfig”目标

搜索menuconfig,没有找到对应的目标,因此推测是通过include包含了其它目录下的Makefile文件

得到以下信息

 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
 kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
 include $(kbuild-file)

以上命令展开之后的结果:include scripts/kconfig/Makefile

3. 打开linux内核源码中的scripts/kconfig/Makefile文件,搜索“menuconfig”字符串,

 menuconfig: $(obj)/mconf
     $< $(silent) $(Kconfig)    

以上命令展开之后的结果为,执行make menuconfig命令

 scripts/kconfig/mconf  Kconfig

Kconfig:mconf可执行程序的第一个参数,linux内核源码目录下的Kconfig文件

mconf程序解析Kconfig文件中的信息,最终调用图形化界面的库,生成图形化的配置界面。

4. 打开linux内核源码目录下的Kconfig文件,解析Kconfig文件中的信息。

此处内容与u-boot源码类似,详见u-boot源码分析

三、分析make uImage执行过程详解

四、分析<board_name>_defconfig, .config, Kconfig, Makefile 四个文件的关系及作用

<board_name>_defconfig :
板子的默认的配置文件,每个板子都有一个对应的默认配置文件,
在linux内核源码的arch/arm/configs目录下

.config :
板子对应的配置文件,给Makefile文件使用
通过执行make <board_name>_defconfig命令在linux源码目录下生成.config文件,执行make menuconfig进行图形化界面配置,可以修改.config文件中的信息

Kconfig :
存放的是菜单选项对应的配置信息,执行make menuconfig生成图形化配置界面时,mconf程序会解析Kconfig文件中的配置信息。

Makefile :linux内核源码配置和编译的。

分析<board_name>_defconfig,.config,Kconfig,Makefile 四个文件的关系
在这里插入图片描述
vmlinux就是一个ARM架构的ELF文件,文件包含符号表以及调试信息等内容,因此该文件较大

调用objcopy,对vmlinux进行格式化拷贝,生成Image,去除掉无用信息,只留下机器指令

调用gzip,对Image进行压缩,得到/arch/arm/boot/compressed目录下的vmlinux

再次调用objcopy,格式化拷贝/arch/arm/boot/compressed目录下的vmlinux,得到zImage

调用mkImage,给zImage添加文件头(64字节),得到uImage

  • 22
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值