linux uImage/zImage生成过程

本文介绍如何使用mkimage工具从zImage或未压缩的Image生成uImage格式,详细解释了Makefile配置过程及scripts/mkuboot.sh脚本的作用。

uImage是zImage通过mkimage工具(在u-boot代码的tools目录中)在前面加了一个64Byte的头生成的。

/usr/bin/mkimage也可以用来生成uImage.

 

也可以直接在Image(未压缩)的基础上加64Byte的头生成uImage, 如下修改。

linux-3.18.19/arch/arm/boot/Makefile:

-$(obj)/uImage: $(obj)/zImage FORCE
+$(obj)/uImage: $(obj)/Image FORCE
 
 
生成uImage 的Makefile部分
nux-3.18.19/arch/arm/boot/Makefile:
$(obj)/uImage:  $(obj)/Image FORCE
    @$(check_for_multiple_loadaddr)
    $(call if_changed,uimage)
    @$(kecho) '  Image $@ is ready'
    @cp $@ $(KBUILD_OUTPUT)/

$(call if_changed,uimage)命令,参考 scripts/Makefile.lib中的cmd_uimage

341 # U-Boot mkimage
342 # ---------------------------------------------------------------------------
343
344 MKIMAGE := $(srctree)/scripts/mkuboot.sh
345
346 # SRCARCH just happens to match slightly more than ARCH (on sparc), so reduces
347 # the number of overrides in arch makefiles
348 UIMAGE_ARCH ?= $(SRCARCH)
349 UIMAGE_COMPRESSION ?= $(if $(2),$(2),none)
350 UIMAGE_OPTS-y ?=
351 UIMAGE_TYPE ?= kernel
352 UIMAGE_LOADADDR ?= arch_must_set_this
353 UIMAGE_ENTRYADDR ?= $(UIMAGE_LOADADDR)
354 UIMAGE_NAME ?= 'Linux-$(KERNELRELEASE) - OmniVision ASIC'
355 UIMAGE_IN ?= $<
356 UIMAGE_OUT ?= $@
357
358 quiet_cmd_uimage = UIMAGE  $(UIMAGE_OUT)
359       cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A $(UIMAGE_ARCH) -O linux \
360             -C $(UIMAGE_COMPRESSION) $(UIMAGE_OPTS-y) \
361             -T $(UIMAGE_TYPE) \
362             -a $(UIMAGE_LOADADDR) -e $(UIMAGE_ENTRYADDR) \
363             -n $(UIMAGE_NAME) -d $(UIMAGE_IN) $(UIMAGE_OUT)

 

scripts/mkuboot.sh:

  1 #!/bin/bash
  2
  3 #
  4 # Build U-Boot image when `mkimage' tool is available.
  5 #
  6
  7 MKIMAGE=$(type -path "${CROSS_COMPILE}mkimage")
  8 if [ -z "${MKIMAGE}" ]; then
  9     MKIMAGE=$(type -path mkimage)
 10     if [ -z "${MKIMAGE}" ]; then
 11         # Doesn't exist
 12         echo '"mkimage" command not found - U-Boot images will not be built' >&2
 13         exit 1;
 14     fi
 15 fi
 16
 17 # Call "mkimage" to create U-Boot image
 18 ${MKIMAGE} "$@"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


scripts/mkuboot.sh

 

<think>好的,我现在要解决用户关于嵌入式Linux启动过程uImagezImage区别的问题。首先,我需要回忆一下这两个术语的相关知识,可能还需要查阅一些资料来确认细节。 我记得在嵌入式系统中,内核映像通常会被压缩,以节省存储空间。zImage应该是其中一种压缩格式的内核映像,而uImage可能与U-Boot相关。不过具体的区别和用途可能更复杂。 根据用户提供的引用,尤其是引用[1]提到,在Linux 2.6之后,直接使用make uImage命令可以生成uImage文件,而生成过程需要mkimage工具。引用[2]显示使用mkimage工具zImage生成uImage,并指定了加载地址和入口点。这说明uImage可能是在zImage的基础上添加了U-Boot所需的头部信息。 另外,引用[3]提到zImage的大小是4.4 MB,而uImage可能包含不同的信息,如启动地址等。引用[4]则讨论了通过SD卡加载uImage,这可能涉及U-Boot的引导流程。 所以,初步结论是:zImageLinux内核的压缩映像,而uImage是经过U-Boot处理的映像,添加了头信息以便U-Boot加载。但需要进一步验证。 接下来要整理两者的主要区别,包括格式、生成方式、使用场景、依赖工具等。同时要确保LaTeX格式正确,例如用$...$包裹数学符号,独立公式使用$$...$$。 还需要生成相关问题,可能涉及如何转换两者,如何配置U-Boot,性能差异等。 最后,检查引用是否正确,比如引用[1]提到生成uImage过程,引用[2]展示mkimage命令,引用[3]关于存储大小,引用[4]关于加载方式。确保每个引用标识符对应正确的来源。</think>### uImagezImage的区别及启动流程解析 在嵌入式Linux开发中,$uImage$和$zImage$是两种常见的内核映像格式,其核心差异体现在**格式定义**和**启动加载流程**上。以下是具体分析: --- #### 1. **格式与结构差异** - **zImage**: 是Linux内核默认生成的压缩映像文件,采用gzip压缩算法,文件结构包含解压代码和压缩后的内核数据。其生成命令为: ```bash make zImage ``` 生成路径通常为`arch/arm/boot/zImage`,文件大小约为4.4 MB(如引用[3]所述)。 - **uImage**: 是U-Boot专用的内核映像格式,在$zImage$基础上通过`mkimage`工具添加了**64字节的U-Boot头**,包含加载地址、入口点、校验和等信息。生成命令示例: ```bash mkimage -A arm -O linux -T kernel -C none -a 0x20008000 -e 0x20008000 -n "Linux Kernel" -d zImage uImage ``` 该头信息使得U-Boot能够正确加载内核(引用[2][^2])。 --- #### 2. **启动流程对比** - **zImage启动**: 需依赖Bootloader(如U-Boot)具备**自动解压能力**。U-Boot将$zImage$加载到内存后,执行解压操作,并将控制权交给解压后的内核。 - **uImage启动**: U-Boot通过解析头部的加载地址(如`Load Address: 30008000`,见引用[1][^1]),直接将内核映像加载到指定内存位置,无需解压步骤,因此启动速度更快。 --- #### 3. **工具依赖与兼容性** - **zImage**: 由内核编译直接生成,无需额外工具。 - **uImage**: 依赖`mkimage`工具(属于U-Boot工具链),需在编译内核前确保该工具已安装。现代Linux内核(如2.6.32版本)支持通过`make uImage`直接生成(引用[1]),但需配置`CONFIG_ARCH_USE_MKIMAGE`选项。 --- #### 4. **应用场景** - **zImage**: 适用于存储空间有限的场景(如SD卡或Flash),因其压缩率更高(引用[3][^3])。 - **uImage**: 主要用于U-Boot环境,支持快速加载和自定义启动参数,常见于需要频繁调试的嵌入式设备(引用[4][^4])。 --- #### 5. **性能与存储对比** $$ \text{存储开销} = \text{内核大小} + \text{头信息} $$ - $zImage$的压缩率更高,但启动时需额外解压时间。 - $uImage$因包含头信息,存储略大,但加载效率更优。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值