文章目录
一、分析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