ludi的个人空间 https://www.eechina.com/space-uid-138953.html [收藏] [复制] [RSS]

博客

Arm linux 内核构建(2)

已有 1230 次阅读2017-11-15 11:38 |个人分类:c语言

本文将继续讲解arm linux内核zImage的生成过程,内核版本号4.10。

 

arch/arm/Makefile文件中,可以看到zImage 依赖于vmlinux,这里的vmlinux指的是根目录下的vmlinux

 

arch/arm/Makefile:

boot := arch/arm/boot

BOOT_TARGETS    = zImage Image xipImage bootpImage uImage

… …

$(BOOT_TARGETS):vmlinux

    $(Q)$(MAKE) $(build)=$(boot)MACHINE=$(MACHINE) $(boot)/$@  --1

 @$(kecho) ' Kernel: $(boot)/$@ is ready'

 

这里的vmlinux是编译生成的linux内核的elf文件:

#file vmlinux

vmlinux: ELF 32-bitLSB executable, ARM, version 1 (SYSV), statically linked, not stripped

 

其中,(build)=$(boot)被扩展为了scripts/Makefile.build obj=arch/arm/boot

buildscripts/Kbuild.include中定义的变量:

build := -f$(srctree)/scripts/Makefile.build obj

 

boot := arch/arm/boot 直接指明该架构的boot文件生成路径,而MACHINE则是由用户配置来决定,嵌入式物联网更多资料企鹅意义气呜呜吧久零就易,毕竟一个ARM CPU可以和各类外设组成不同的机器架构。

ifneq ($(machine-y),)

MACHINE  := arch/arm/mach-$(word 1,$(machine-y))/

else

MACHINE  :=

endif

 

比如:

machine-$(CONFIG_ARCH_S3C64XX)    := s3c6400 s3c6410

在内核配置文件.config可以找到CONFIG_ARCH_S3C64XX=y

这样,语句(1)就可以解析成:

make -fscripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/mach-s3c6400/arch/arm/boot/zImage

 

接着看scripts/Makefile.build,它包含arch/arm/boot/Makefile文件的方式有些特殊,它是从上面的命令行得到obj,然后找到对应文件夹下的Makefile并执行。

scripts/Makefile.build的开头,src的值被赋值为arch/arm/boot

src := $(obj)

… …

# The filename Kbuildhas precedence over 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)

 

kbuild-file就是src指定路径下的Makefile文件,此时就是arch/arm/boot/Makefile,它包含了构建arch/arm/boot/zImage的规则。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部