linux内核移植之一 linux-4.1.4的zImage生成(Makefile分析)

发布者:Ziran520最新更新时间:2022-07-25 来源: csdn关键字:linux  内核移植 手机看文章 扫描二维码
随时随地手机看文章

一 编译过程

仍然以2410的编译说明,执行如下步骤

(1)主Makefile修改变量如下

ARCH  := arm

CROSS_COMPILE   := arm-linux-

(2)make s3c2410_defconfig

(3)make zImage

最终生成用于uboot启动的内核应该是uImage,uImage是zImage通过uboot的mkimage工具加上一个文件头生成的,这里只分析到zImage。



二 make s3c2410_defconfig分析

主Makefile下有如下定义:

%config: scripts_basic outputmakefile FORCE

$(Q)$(MAKE) $(build)=scripts/kconfig $@

可以转化为

s3c2410_defconfig: scripts_basic outputmakefile FORCE

make -f ./scripts/Makefile.build obj=scripts/kconfig s3c2410_defconfig

其中scripts_basic用于生成编译内核使用的fixdep程序,outputmakefile和FORCE这里为空。

然后执行scripts/Makefile.build里面的目标,具体的目标包含在scripts/Kconfig/Makefile中,如下语句:

%_defconfig: $(obj)/conf

$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

可以转化为

s3c2410_defconfig: scripts/kconfig/conf

scripts/kconfig/conf -s --defconfig=arch/arm/configs/s3c2410_defconfig Kconfig



三 make zImage分析

(1)zImage的

在主makefile中包含arch/arm/Makefile,并有如下定义,其中zImage为BOOT_TARGETS的一部分。

$(BOOT_TARGETS): vmlinux

$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

可以转化为

zImage: vmlinux

make -f ./scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/mach-s3c24xx arch/arm/boot/zImage

进入scripts/Makefile.build执行,scripts/Makefile.build包含了arch/arm/boot/Makefile,其中有如下定义:

$(obj)/zImage:  $(obj)/compressed/vmlinux FORCE

$(call if_changed,objcopy)

@$(kecho) '  Kernel: $@ is ready'

可以转换为:

arch/arm/boot/zImage : arch/arm/boot/compressed/vmlinux FORCE

$(call if_changed,objcopy)

相当于执行cmd_objcopy,scripts/Makefile.lib中如下定义:

cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@

相当于之心arm-linux-objcopy -O binary -R .comment -S arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage

实质是把elf格式的压缩的vmlinux转化为二进制格式的zImage

总结:生成需要arch/arm/boot/zImage,需要分析arch/arm/boot/compressed/vmlinux



(2)arch/arm/boot/compressed/vmlinux的生成

arch/arm/boot/Makefile有标号如下:

$(obj)/compressed/vmlinux: $(obj)/Image FORCE

$(Q)$(MAKE) $(build)=$(obj)/compressed $@

可以转换为

arch/arm/boot/compressed/vmlinux : arch/arm/boot/Image

make -f ./scripts/Makefile.build obj=arch/arm/boot/compressed arch/arm/boot/compressed/vmlinux

这次执行的Makefile.build包含了arch/arm/boot/compressed/Makefile,并在其中有如下定义:

$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o

$(addprefix $(obj)/, $(OBJS)) $(lib1funcs) $(ashldi3)

$(bswapsdi2) FORCE

@$(check_for_multiple_zreladdr)

$(call if_changed,ld)

@$(check_for_bad_syms)

实质就是执行了cmd_ld,即如下链接命令:

cmd_ld = arm-linux-ld --defsym _kernel_bss_size=$(KBSS_SZ) --defsym zreladdr=$(ZRELADDR) --be8 -p --no-undefined -X -T

   arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.gzip.o arch/arm/boot/compressed/$(OBJS)) arch/arm/boot/compressed/lib1funcs.o arch/arm/boot/compressed/ashldi3.o arch/arm/boot/compressed/bswapsdi2.o -o arch/arm/boot/compressed/vmlinux

总结  :生成需要arch/arm/boot/compressed/vmlinux,需要分析一些目标文件,下面分析piggy.o

注:有定义:suffix_$(CONFIG_KERNEL_GZIP) = gzip,当前suffix_y = gzip



(3) piggy.gzip.o的生成

在上一部分"arch/arm/boot/compressed/vmlinux的生成"中,$(obj)/piggy.$(suffix_y).曾经作为arch/arm/boot/compressed/vmlinux的依赖出现,所以会先生成这个$(obj)/piggy.$(suffix_y),即piggy.gzip.o,会依据scripts/Makefile.build的%.o的标号,由piggy.gzip.S生成piggy.gzip.o。实质piggy.gzip.S的内容就是piggy.gzip。

有如下定义

$(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE

$(call if_changed,$(suffix_y))

可以转化为:

arch/arm/boot/compressed/piggy.gzip : arch/arm/boot/Image

$(call if_changed,gzip)

相当于执行cmd_gzip,在scripts/Makefile.lib有如下定义:

cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -n -f -9 > $@) ||

(rm -f $@ ; false)

可以转化为:

cmd_zip = (cat arch/arm/boot/Image) | gzip -n -f -9 > arch/arm/boot/compressed/piggy.gzip || (rm -f arch/arm/boot/compressed/piggy.gzip; false)

将arch/arm/boot/Image压缩成piggy.gzip的命令。



(4)arch/arm/boot/Image的生成

arch/arm/boot/Image在步骤2"arch/arm/boot/compressed/vmlinux的生成"中已经是arch/arm/boot/compressed/vmlinux的依赖条件,那时候的obj为arch/arm/boot,所以包含了arch/arm/boot/Image/Makefile,并在其中有如下定义:

$(obj)/Image: vmlinux FORCE

$(call if_changed,objcopy)

@$(kecho) '  Kernel: $@ is ready'

可以转换为:

arch/arm/boot/Image : vmlinux

$(call if_changed,objcopy)

根据前面分析一直知道是一个将vmlinux这个elf格式的文件转化为二进制格式的Image

接下来就是vmlinux的生成,没有目录,说明是主目录下的vmlinux



(5)vmlinux的生成

在步骤1中zImage的生成的依赖为vmlinux,当时的目录恰好是主Makefile,在主Makefile有定义,恰好是链接目标文件的过程,这里不再详细说明,详见linux-2.6.22.6的分析。



(6)uImage生成的总结

uImage生成步骤与linux-2.6.22.6基本一致。如下:

(a)生成基本的目标文件

(b)将基本的目标文件链接成vmlinux

(c)将vmlinux这个elf格式的文件转化为直接可以运行的arch/arm/boot/Image

(d)将arch/arm/boot/Image压缩为arch/arm/boot/compressed/piggy.gzip.o

(e)将一些解压信息和arch/arm/boot/compressed/vmlinux/piggy.gzip.o一起链接为arch/arm/boot/compressed/vmlinux。

(f)将arch/arm/boot/compressed/vmlinux这个elf格式文件转化为可直接运行的arch/arm/boot/zImage

(g)用mkimage将zImage转化为uImage

关键字:linux  内核移植 引用地址:linux内核移植之一 linux-4.1.4的zImage生成(Makefile分析)

上一篇:u-boot移植之一 uboot-2015.04 Makefile分析
下一篇:linux内核移植之二 linux-4.1.4的移植过程

推荐阅读最新更新时间:2024-11-09 12:42

基于Video4Linux的摄像头驱动设计
0引言 随着多媒体技术、网络技术的迅猛发展和后PC机时代的到来,利用嵌人式系统实现远程视频监控、可视电话和视频会议等应用已成为可能。为了实现这些应用,实时获得视频数据是一个重要环节。针对这一点本文在嵌入式系统平台上,基于Video4Linux(简称V4L)技术,实现了摄像头驱动开发,详细叙述了V4L技术和摄像头在Blackfin536 DSP平台上的Linux驱动程序设计。 1 Video4Linux V4L是Linux的影像串流系统与嵌入式影像系统的基础。Linux在TV、多媒体上的应用是目前相当热门的研究领域,而其中最关键的技术则是Linux的V4L。V4L是Linux kernel里支持影像设备的一组APIs,配合适当的
[嵌入式]
基于Video4<font color='red'>Linux</font>的摄像头驱动设计
Linux 6.5内核增加对高通开源GPU Adreno 690的支持
即将推出的Linux 6.5内核将把对高通Adreno 690 GPU的支持添加到开源的MSM内核图形/显示驱动程序中。A690主要用于骁龙8cx第三代(SC8280XP)平台,而联想ThinkPad X13s笔记本电脑和其他硬件也采用了该平台。 MSM Adreno Direct Rendering Manager (DRM)驱动程序已经排队支持Adreno A690,包含近200行代码,超过了对现有Adreno 600系列硬件的支持。该支持是通过Linaro提供的。 本周,Adreno A690支持作为drm-msm-next的一部分被送入,DRM-next的MSM驱动变化将在即将到来的Linux 6.5内核合并窗口排
[嵌入式]
linux-2.6.32在mini2440开发板上移植-修改linux开机logo
修改Linux LOGO 编者:linux的开机默认logo是一只可爱的小企鹅。这里我们可以把它换成我们自己喜爱的图片,只要将linux-2.6.32.2/drivers/video/logo/linux_logo_clut224.ppm替换成自己的图片即可。方法很简单,照着操作基本就没问题。以下按照手册介绍两种方法。注意在进行图片的转换时候,一定要先注意图片的大小,要和使用的液晶屏的大小匹配。我这是320*240的。 1 使用命令行工具修改Linux LOGO linux-2.6.32.2/drivers/video/logo/linux_logo_clut224.ppm文件是一个特殊格式的图像文件,有很多方法可以把普
[单片机]
Ubuntu 24.04 LTS默认采用Linux6.8内核,实验性版本可通过PPA获得
Ubuntu 23.04“Lunar Lobster”在去年 4 月发布,这是一个“短期支持版本”,拥有 9 个月支持周期,目前该发行版的官方支持已经正式结束。 此前许多人在讨论 Ubuntu 24.04 LTS 会采用哪个内核版本,大部分人都认为会是 6.6~6.7。现在 Canonical 工程师 Andrea Righi 宣布将在 Ubuntu 24.04 中采用 Linux 6.8 作为默认内核。 根据 Canonical 公布的更新计划:下一个长期支持 Ubuntu 桌面 / 服务器发行版将采用 Linux 6.8 作为默认内核,预计将于 4 月 25 日发布。 据介绍,新版 Ubuntu Noble 内核的实验版本
[嵌入式]
OK6410A 开发板 (八) 79 linux-5.11 OK6410A schedule总览
__schedule 功能描述 __schedule 1.完成一些必要的检查, 并设置进程状态, 处理进程所在的就绪队列 2.调度全局的pick_next_task选择抢占的进程 2.1 如果当前cpu上所有的进程都是cfs调度的普通非实时进程, 则直接用cfs调度找到进程 如果无程序可调度则找到 idle进程 2.2 否则从优先级最高的调度器类sched_class_highest(目前是stop_sched_class)开始依次遍历所有调度器类的pick_next_task函数, 选择最优的那个进程 //本例有 dl - rt - fair - idle //支持
[单片机]
Linux移植移植步骤
在这里总结一下我在移植Linux2.6.22.6内核过程时的步骤。移植成功后最终能挂接做好的根文件系统,并且启动第一个init程序。移植的步骤如下: 1、将网上下载的内核源码文件linux-2.6.22.6.tar.bz2放入/work/system路径下。 2、切换到/work/system,使用tar xjf linux-2.6.22.6.tar.bz2解压缩内核源码文件得到一个名为linux-2.6.22.6的文件夹 3、cd linux-2.6.22.6切换到内核文件夹 4、修改顶层Makefile文件使得 ARCH ?= arm;CROSS_COMPILE ?= arm-linux- 5、执行make
[单片机]
linux UART串口驱动开发文档
一. Linux的串口接口及层次. 串口是使用已经非常广的设备了, 因此在linux下面的支持已经很完善了, 具有统一的编程接口, 驱动开发者所要完整的工作就是针对不同的串口IC来做完成相应的配置宏, 这此配置宏包括读与写, 中断打开与关闭(如传送与接收中断), 接收状态处理, 有FIFO时还要处理FIFO的状态. 如下我们就首先切入这一部分, 具体了解一下与硬件串口IC相关的部分在驱动中的处理, 这一部分可以说是串口驱动中的最基础部分, 直接与硬件打交道, 完成最底层具体的串口数据传输. 1. 串口硬件资源的处理. W83697及W83977在ep93xx板子上的映射的硬件物理空间如下: W83697: 0x200000
[单片机]
3.4.嵌入式linux内核制作
前面我们已经制作了uboot,接下来是制作kernel。 首先进入内核源码,执行make distclean.清除先前编译产生的文件。 注意配置内核的时候多了一个ARCH=arm的条件。 回车之后会进入arm的配置菜单: 就像我们前面配置linux内核一样,我们也会去找一个配置好的配置文件: 把config-file拷贝到我们的内核代码目录下: 然后把config-file拷贝成.config. 重新进入配置界面,发现配置生效了。 接下来就是内核的编译: 在编译的过程中会出现这样的一个错误: 这是因为,我们的可执行文件,都有一个文件头,是mkimage帮我们加上去的。现在系统找不到它。
[单片机]
3.4.嵌入式<font color='red'>linux</font><font color='red'>内核</font>制作
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved