2.整理内核编译流程:uImage/zImage/Image/vmlinx之间关系

news/2024/11/8 18:28:39/
  1. uImage镜像文件的分析

1.在内核源码顶层目录下打开Makefile文件,搜索uImage,发现没有目标,猜测在Makefile中包含其他路径的Makefile文件
596 include arch/$(SRCARCH)/Makefile = arch/arm/Makefile2.进入arch/arm目录下,打开Makefile文件,搜索uImage,打印每个变量信息
323 $(BOOT_TARGETS): vmlinux
324 $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@打印信息内容:
@ -f ./scripts/Makefile.build obj arch/arm/boot uImage make -f ./scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/boot/uImage
3.进入内核源码/scripts/Makefile.build文件,搜索uImage
6 src := $(obj)=arch/arm/boot
42 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) kbuild-dir :=$(src)
43 kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) kbuild-file := $(kbuild-dir)/Kbuild和$(kbuild-dir)/Makefile
44 include $(kbuild-file) :将 arch/arm/boot/Makefile和当前的Makfile.build文件合并
4.进入内核源码arch/arm/boot/,打开Makefile文件,搜索uImage
89 $(obj)/uImage: $(obj)/zImage FORCE
90 @$(check_for_multiple_loadaddr) ------->检测uImage镜像文件的入口地址
91 $(call if_changed,uimage)------->call:调用if_changed命令,makefile中固定的用法
5. 入内核源码arch/arm/boot/,打开Makefile文件,
指定LOADADDR这个变量的信息,将加载的地址赋值
70 LOADADDR = 0xc2000000 -------> 需要添加内容 71 ifneq ($(LOADADDR),)
72 UIMAGE_LOADADDR=$(LOADADDR)
6.进入内核源码
scripts/Kbuild.include目录下,搜索:if_changed
218 if_changed = $(if $(newer-prereqs)$(cmd-check),
219 $(cmd);
183 cmd = @set -e; $(echo-cmd) $($(quiet)redirect) $(cmd_$(1)) @set -e:在执行的时候有错误就直接退出 $(cmd_$(1)) = cmd_uimage
7. 进入内核源码scripts/Makefile.lib目录下,搜索cmd_uimage
398 cmd_uimage = $(BASH) $(MKIMAGE) -A $(UIMAGE_ARCH) -O linux \
399 -C $(UIMAGE_COMPRESSION) $(UIMAGE_OPTS-y) \
400 -T $(UIMAGE_TYPE) \
401 -a $(UIMAGE_LOADADDR) -e $(UIMAGE_ENTRYADDR) \
402 -n $(UIMAGE_NAME) -d $< $@
解析: 385 MKIMAGE := ./scripts/mkuboot.sh cmd_uimage = /usr/bin/mkimage -A arm -O linux -C gzip -T kernel -n uImage -d zImage
8.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: 717
2080 Bytes = 7003.98 KiB = 6.84 MiB Load Address: c2000000 Entry Point: c2000000

2..zImage镜像文件的分析

1.进入内核源码arch/arm/boot/,打开Makefile文件,搜索zImage
66 $(obj)/zImage: $(obj)/compressed/vmlinux FORCE 67 $(call if_changed,objcopy) ---->cmd_objcopy
267 cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
arm-linux-gnueabihf-objcopy $(obj)/compressed/vmlinux zImage
2.zImage和arch/arm/boot/compressed/vmlinux关系?
zImage是通过vmlinux格式化转换为的文件

3.compressed/vmlinux文件

1.进入内核源码arch/arm/boot/,打开Makefile文件,搜索vmlinux
63 $(obj)/compressed/vmlinux: $(obj)/Image FORCE 64 $(Q) $(MAKE) $(build)=$(obj)/compressed $@
执行命令:make -f ./scripts/Makefile.build obj=arch/arm/boot/compressed arch/arm/boot/compressed/vmlinux
2.进入内核源码arch/arm/boot/compressed,打开Makefile文件,搜索vmlinux
178 $(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
179 $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) $(ashldi3) \
180 $(bswapsdi2) $(efi-obj-y) FORCE
182 $(call if_changed,ld) ---->cmd_ld
arch/arm/boot/vmlinux.lds head.o piggy.o debug.o lib1funcs.o lib1funcs.S ashldi3.S bswapsdi2.S hyp-stub.S bswapsdi2.o lib.a
arm-linux-gnueabihf-ld vmlinux.lds head.o piggy.o debug.o lib1funcs.o lib1funcs.S ashldi3.S bswapsdi2.S hyp-stub.S bswapsdi2.o lib.a -o vmlinux
185 $(obj)/piggy_data: $(obj)/../Image FORCE
186 $(call if_changed,$(gzip)) ----->调用cmd_gzip
188 $(obj)/piggy.o: $(obj)/piggy_data
3.进入内核源码scripts/Makefile.lib目录下,搜索cmd_gzip
cmd_gzip = $(KGZIP) -n -f -9 > $@ = gzip Image > vmlinx4.rch/arm/boot/compressedvmlinux文件和Image之间关系
将Image镜像文件经过gzip压缩生成rch/arm/boot/compressed/vmlinx镜像文件

4.Image镜像文件

.进入内核源码arch/arm/boot/compressed,打开Makefile文件,搜索Image
60 $(obj)/Image: vmlinux FORCE
61 $(call if_changed,objcopy) ----->调用cmd_objcopy
2.Image和内核顶层目录下vmlinx关系
vmlinux通过objcopy格式化转换为Image

5.总结

vmlinx--->objcopy--->Image--->gzip--->arch/arm/boot/compressed/vmlinx--->objcopy--->zImage--->mkimage--->uImage

http://www.ppmy.cn/news/31159.html

相关文章

DMHS搭建DMDSC 2节点集群同步到单库

DMHS搭建DMDSC 2节点集群同步到单库环境介绍1 安装DMOCI1.1 关闭数据库实例服务1.2 将DMOCI 复制到源端与目的端的数据库bin目录1.3 对数据库bin 执行目录文件更改用户属组和权限2 启动源数据库服务并配置数据库实例参数2.1 使用DMCSSM启动集群实例2.2 DMDSC源其中一个节点执行…

软件测试分类知识分享,第三方软件测试机构收费贵不贵?

软件测试可以很好的检验软件产品的质量以及规避产品上线之后可能会发生的错误&#xff0c;随着技术的发展&#xff0c;软件测试已经是一个完整且体系庞大的测试活动&#xff0c;不同的测试领域有着不同的测试方法、技术与名称&#xff0c;那么具体有哪些分类呢? 一、软件测试…

【微信小程序】-- WXS 脚本(二十九)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

ALG和STUN

目录 ALG 应用层网关讲解 Client1使用FTP主动模式建立FTP Client1使用FTP被动模式建立FTP STUN讲解 ALG 应用层网关讲解 用来替换应用层信息 Client1使用FTP主动模式建立FTP 主动模式&#xff1a;服务器收到客户端发来的请求FTP的地址和端口 服务器使用20端口直接向客户端建…

LearnOpenGL-光照-1.颜色

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject 文章目录颜色OpenGL代码例子颜色 物体颜色简介 我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有…

第十四届蓝桥杯第三期模拟赛 C/C++ B组 原题与详解

文章目录 一、填空题 1、1 找最小全字母十六进制数 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 给列命名 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 日期相等 1、3、1 题目描述 1、3、2 题解关键思路与解答 1、4 乘积方案数 1、4、1 题目描述 1、4、2 题解关…

Spring的@Conditional注解

前言Conditional是Spring4新提供的注解&#xff0c;它的作用是按照一定的条件进行判断&#xff0c;满足条件给容器注册bean。Conditional的源码定义&#xff1a;//此注解可以标注在类和方法上 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTI…

【模板进阶】

目录 1. 非类型模板参数 2. 模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 3 模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 4. 模板总结 有需要的老哥可以先看看模板的介绍&#xff1a;http://t.csdn.cn/2TkUYhttp://t.csdn.cn/2TkUY 1. …