概述
首先拿到kernel,我们和uboot一样,首先进行 make *_defconfig,然后看到底做了什么呢?
搜索: find . -name *defconfig 文件。我们找到对应板卡。
./arch/arm/configs/xilinx_zynq_defconfig
首先我们执行 make xilinx_zynq_defconfig
看打印:
# configuration written to .config
此时查看当前目录,产生了一个.config的文件
//大致内容
CONFIG_ARM=y
CONFIG_ARM_HAS_SG_CHAIN=y
CONFIG_MIGHT_HAVE_PCI=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_HAVE_PROC_CPU=y
CONFIG_NO_IOPORT_MAP=y
接着顺藤摸瓜,grep “CONFIG_MIGHT_HAVE_PCI” * -rR。看看哪里用了这个些。
include/generated/autoconf.h:#define CONFIG_MIGHT_HAVE_PCI 1
include/config/auto.conf:CONFIG_MIGHT_HAVE_PCI=y
由此可知道 make xilinx_zynq_defconfig,产生了2个文件autoconf.h(源代码用),auto.conf(Makefile用)。
分析 arch/arm目录下的Makefile:
head-y := arch/arm/kernel/head$(MMUEXT).o #head-y == head.o
#core-y 所需要的原材料(下一级Makefile)
core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
core-y += arch/arm/probes/
core-y += arch/arm/net/
core-y += arch/arm/crypto/
core-y += arch/arm/firmware/
core-y += $(machdirs) $(platdirs)
BOOT_TARGETS = zImage Image xipImage bootpImage uImage
$(BOOT_TARGETS): vmlinux #可以看出Image 依赖于 vmlinux
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
#core-y := usr/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 arch/arm/kernel/built-in.o arch/arm/mm/built-in.o #arch/arm/common/built-in.o
分析顶层Makefile主要内容:
ARCH ?= arm //架构
CROSS_COMPILE ?= arm-xilinx-linux-gnueabi- //编译工具链
include arch/$(SRCARCH)/Makefile // 包含arch/arm/Makefile(上面描述的)
include/config/auto.conf //包含make *_defconfig产生的auto.conf决定要把哪些内容编译到内核里面(-y)或者编译成模块(-m)
#先看看要编译哪些目录
init-y := init/
drivers-y := drivers/ sound/ firmware/
net-y := net/
libs-y := lib/
core-y := usr/
virt-y := virt/
all: vmlinux #指定编译目标
init-y := $(patsubst %/, %/built-in.o, $(init-y)) #init/目录下替换命令,init/ ->init/built-in.o
core-y := $(patsubst %/, %/built-in.o, $(core-y))
drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y))
net-y := $(patsubst %/, %/built-in.o, $(net-y))
libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
libs-y := $(libs-y1) $(libs-y2)
virt-y := $(patsubst %/, %/built-in.o, $(virt-y))
#vmlinux的依赖
#vmlinux:
# $(head-y) $(init-y)$(core-y) $(libs-y) $(drivers-y) $(net-y) $(virt-y) #第一个就是head.o
# vmlinux.lds #链接脚本
#具体如下:core-y就依赖于arch/arm/Makefile
export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y) $(virt-y)
export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE
最后
以上就是尊敬芹菜为你收集整理的kernel之Makefile分析的全部内容,希望文章能够帮你解决kernel之Makefile分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复