一、分析vmlinux可执行文件是如何生成的?
1、分析内核的底层 makefile 如下:
vmlinux: scripts/link-vmlinux.sh vmlinux_prereq $(vmlinux-deps) FORCE+$(call if_changed,link-vmlinux)vmlinux_prereq: $(vmlinux-deps) FORCE
发现vmlinux的生成主要依赖于 vmlinux-deps。
vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) $(KBUILD_VMLINUX_LIBS)
KBUILD_LDS:是一个链接文件。
KBUILD_VMLINUX_MAIN:是一些库和驱动。
分析一下KBUILD_VMLINUX_INIT
init-y := $(patsubst %/, %/built-in.o, $(init-y))
...
KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
可以看出来 KBUILD_VMLINUX_INIT 是一些目录下的 built-in.o 文件。
二、整理内核编译流程:uImage/zImage/Image/vmlinx之间关系
1、Image和内核顶层目录下vmlinx关系?
vmlinux通过objcopy格式化转换为Image
2、rch/arm/boot/compressedvmlinux文件和Image之间关系?
将Image镜像文件经过gzip压缩生成rch/arm/boot/compressed/vmlinx镜像文件
3、zImage和arch/arm/boot/compressed/vmlinux关系?
zImage是通过vmlinux格式化转换为的文件
4、uImage和zImage之间关系?
1)uImage使用在zImage使用mkimage工具得到的,uImage在zImage前添加64字节头部信息。
2)每次编译打印信息的内容就是编译到uImage中内容:
Image Name: Linux-5.10.61
Created: Wed Mar 8 16:15:39 2023
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 7172080 Bytes = 7003.98 KiB = 6.84 MiB
Load Address: c2000000
Entry Point: c2000000
总结内核编译流程:
vmlinx--->objcopy--->Image--->gzip--->arch/arm/boot/compressed/vmlinx--->objcopy--->zImage--->mkimage--->uImage
上一篇:【每日一题Day140】剑指 Offer 47. 礼物的最大价值 | 动态规划 记忆化搜索
下一篇:English Learning - L2-5 英音地道语音语调 弹力双元音 [ɪə] [ʊə] [eə] 2023.03.6 周一