十一、Linux内核的构建和编译

linux内核的编译过程和u-boot很类似,使用如下几条命令:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j2

linux的默认配置文件位于arch/arm/configs目录中,而u-boot的默认配置文件位于根目录下的configs中。

执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j2命令时,顶层Makefile中匹配目标all

# The all: target is the default when no target is given on the
# command line.
# This allow a user to issue only 'make' to build a kernel including modules
# Defaults to vmlinux, but the arch makefile usually adds further targets
all: vmlinux

all依赖vmlinux,所以重点就是vmlinux

vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)

# Final link of vmlinux
cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux)
quiet_cmd_link-vmlinux = LINK    $@

# Include targets which we want to
# execute if the rest of the kernel build went well.
vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE
ifdef CONFIG_HEADERS_CHECK
	$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
endif
ifdef CONFIG_SAMPLES
	$(Q)$(MAKE) $(build)=samples
endif
ifdef CONFIG_BUILD_DOCSRC
	$(Q)$(MAKE) $(build)=Documentation
endif
ifdef CONFIG_GDB_SCRIPTS
	$(Q)ln -fsn `cd $(srctree) && /bin/pwd`/scripts/gdb/vmlinux-gdb.py
endif
	+$(call if_changed,link-vmlinux)

vmlinux-deps展开后得到vmlinux的依赖为:scripts/link-vmlinux.sh$(head-y)$(init-y)$(core-y)$(libs-y)$(drivers-y)$(net-y)arch/arm/kernel/vmlinux.ldsFORCE

+$(call if_changed,link-vmlinux)则通过if_changed函数来执行cmd_link-vmlinux命令,将这些依赖编译出的built-in.o.a文件等链接生成ELF格式的vmlinux,所以接下来就重点分析这几个依赖包含了哪些目录的代码文件。

大家可以打印出这几个变量的值,对于imx6ull,它们最终的值如下:

head-y = arch/arm/kernel/head.o
init-y = init/built-in.o
drivers-y = drivers/built-in.o sound/built-in.o firmware/built-in.o
net-y = net/built-in.o
libs-y = arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o
core-y = usr/built-in.o arch/arm/vfp/built-in.o \
		 arch/arm/vdso/built-in.o arch/arm/kernel/built-in.o \
		 arch/arm/mm/built-in.o arch/arm/common/built-in.o \
         arch/arm/probes/built-in.o arch/arm/net/built-in.o \
         arch/arm/crypto/built-in.o arch/arm/firmware/built-in.o \
         arch/arm/mach-imx/built-in.o kernel/built-in.o\
         mm/built-in.o fs/built-in.o \
         ipc/built-in.o security/built-in.o \
         crypto/built-in.o block/built-in.o

cmd_link-vmlinux 在顶层 Makefile 中定义如下:

# Final link of vmlinux
      cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux)
quiet_cmd_link-vmlinux = LINK    $@

展开之后如下:

cmd_link-vmlinux = /bin/bash scripts/link-vmlinux.sh arm-linux-gnueabihf-ld -EL -p --no-u
ndefined -X --pic-veneer --build-id

可以看出最终执行了脚本scripts/link-vmlinux.sh来链接出vmlinux。在scripts/link-vmlinux.sh里面,最终链接生成vmlinux的具体命令如下:

${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2} \
	-T ${lds} ${KBUILD_VMLINUX_INIT} \
	--start-group ${KBUILD_VMLINUX_MAIN} --end-group ${1}

链接脚本是${lds}=./arch/arm/kernel/vmlinux.lds,而需要链接在一起的.o和.a文件则由${KBUILD_VMLINUX_INIT}${KBUILD_VMLINUX_MAIN}指定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值