我是靠谱客的博主 尊敬芹菜,最近开发中收集的这篇文章主要介绍kernel之Makefile分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

首先拿到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分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部