arm 源码编译kernel 对比image zimage uimage vmlinux

一 源码编译kernel

        下载交叉编译工具链

          下载cc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz ,这是官网的。使用下面命令下载。

  585  wget https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
  587  tar Jxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz 
  590  echo $PATH
  591  export PATH=$(pwd)/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin:$PATH
  596  arm-linux-gnueabihf-gcc --version

     出现下面命令说明成功了

root@33ca02c8b788:/home/root/linux-5.10.52# arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (Linaro GCC 4.9-2017.01) 4.9.4
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

root@33ca02c8b788:/home/root/linux-5.10.52# 

一次输入上面的命令,arm-linux-gnueabihf-gcc --version执行成功,说明toolchain安装成功。

        u-boot源码编译

           这个u-boot我这里就不介绍了。

     

        内核源码编译 

下载linux内核,内核版本5.15.6. 执行下面命令

wget -c https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.6.tar.xz
tar Jxf linux-5.15.6.tar.xz
cd linux-5.10.52

   编译内核,使用交叉编译链arm-linux-gnueabihf进行编译。使用三星2410的板子。

cp arch/arm/configs/s3c2410_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig -j4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 8 

    编译完成后,会生成后面几个目录。

 这个直接编译出来的elf文件,没有经过压缩,它的大小是100多M。

 生成zImage,这个镜像是经过压缩的,但是不能烧录到板子上。

 compressed目录下压缩vmlinux。

  编译uimage

mkimage -A arm -O linux -T kernel -C none -a 0x8080088 -e 0x8080088  -n "Linux kernel" -d arch/arm/boot/zImage uImage

mkimage是u-boot编译出来的命令,就是说,你要执行这个命令前,需要安装u-boot或者源码编译u-boot,我建议源码编译,使用toolchain编译出来。

二 对比各个镜像差异

名称含义
vmlinux

linux内核编译出来的原始的内核文件,elf格式,未做压缩处理。该映像可用于定位内核问题,但不能直接引导Linux系统启动。

image

Linux内核编译时,使用objcopy处理vmlinux后生成的二进制内核映像。该映像未压缩,可直接引导Linux系统启动。

压缩vmlinux 这个是在arch/arm/boot/compressed目录下,使用gzip压缩,具体可以看一下内核源码,有两个文件实现这个功能
zimage

使用gzip压缩Image后,使用objcopy命令生成的Linux内核映像。该映像一般作为uboot的引导映像文件

initrd没有搞清楚,怎么编译出来的
uimage在zImage前面增加一个64字节的头,描述映像文件类型,加载位置,大小等信息。该映像是老版本uboot专用的引导映像。

linux不同类型镜像生成过程:

上面的详细流程可以参考这两个连接,结合linux2.6.32内核。

分析vmlinux,uImage,zImage,Image的生成以及之间的关系_objcopy vmlinux zimage_小笙到此一游的博客-优快云博客

Linux内核源码分析--zImage出生实录(Linux-3.0 ARMv7) - 程序员大本营

注: zImage 和uImage 用于32位内核。

<think>我们正在讨论uImagezImage的区别,之前的引用中已经提到了一些信息。 引用[1]指出:uImage是U-Boot专用的格式,而zImageARM、MIPS等架构常用的格式,并且zImage的最大尺寸在8MB左右。 引用[2]提到:在构建内核镜像时,会有vmlinuxImagezImageuImage等不同格式。 根据这些信息以及我对Linux内核镜像格式的了解,我来整理一下: 1. **zImage**: - 是压缩的内核镜像,通常用于x86架构(但在引用[1]中提到了ARM和MIPS,其实zImage也常用于这些架构)。 - 它是在Image(未压缩的内核镜像)的基础上使用gzip压缩后,再加上一个解压缩头构成的。 - 大小限制:因为其加载方式(单一连续块)和早期的引导加载程序(如LILO)的限制,传统上zImage的大小不能超过约640KB(但后来有扩展,如bzImage)。然而,在非x86架构(如ARM)上,zImage的大小限制可以更大(例如,引用[1]提到约8MB,但实际上可能因平台而异)。 2. **bzImage**: - 是“big zImage”的缩写,主要用于x86架构。它解决了zImage在x86上的大小限制(可以更大,32位下约16MB,64位下可达2GB)。 - 与zImage的主要区别在于加载方式:zImage被加载到低端内存(第一个640KB以内),而bzImage可以加载到高端内存(1MB以上)。 3. **uImage**: - 是U-Boot引导加载程序专用的内核镜像格式。 - 它是在zImage(或未压缩的Image)的基础上加上一个64字节的U-Boot头构成的。 - 这个头包括:内核加载地址、入口地址、镜像类型、创建时间、CRC校验等信息。这样U-Boot在加载内核时就可以知道如何处理这个镜像。 - 使用场景:主要用于嵌入式系统中,当使用U-Boot作为引导加载程序时。 区别总结: - **格式结构**:zImage(或bzImage)是Linux内核自带的压缩格式,而uImage是在此基础上添加U-Boot头。 - **引导加载程序支持**:zImage可以由常见的引导加载程序(如LILO、GRUB)加载,但uImage专门用于U-Boot。 - **大小限制**:不同架构下大小限制不同,但uImage通常是在zImage基础上添加头部,所以会略大一点(多64字节),但实质内容一样。 - **加载信息**:uImage头中指定了加载地址和入口地址,U-Boot可以直接使用这些信息加载内核,而zImage通常需要引导加载程序事先知道这些信息(或通过固定地址)。 使用场景: - **zImage/bzImage**:在PC体系结构(x86)或部分嵌入式架构中(当引导加载程序支持zImage时)使用。 - **uImage**:在嵌入式系统中,使用U-Boot引导加载程序时使用。 生成方式: - zImage:在内核源码目录中,通过`make zImage`生成(具体架构可能需要在make时指定ARCH和CROSS_COMPILE)。 - uImage:通常使用U-Boot提供的工具`mkimage`将zImage转换成uImage。命令示例: $$ mkimage -A arm -O linux -T kernel -C none -a 0x20008000 -e 0x20008000 -n "Linux Kernel" -d zImage uImage $$ 其中,`-a`指定加载地址,`-e`指定入口地址(通常两者相同)。 注意事项: - 由于uImage是在zImage基础上添加头部,所以如果引导加载程序不是U-Boot,则不应该使用uImage。 - 在U-Boot中,可以使用命令`bootm`来引导uImage,而zImage则通常使用`bootz`命令(需要U-Boot支持)。 相关问题: - 1. 如何将zImage转换为uImage? - 2. 不同的引导加载程序(如GRUB, U-Boot, LILO)分别支持哪些内核镜像格式? - 3. 在内核编译过程中,vmlinuxImagezImageuImage之间的关系是什么? - 4. 为什么嵌入式系统中常用U-Boot? - 5. uImage头部的64字节具体包含哪些信息? 根据引用[2],在构建过程中,首先会生成vmlinux(未压缩的ELF格式的内核),然后生成Image(去除了符号信息和重定位信息的二进制文件),再将Image压缩成zImage,最后如果需要uImage,则用mkimage工具处理zImage。 因此,我们可以这样总结: 生成顺序: $$ \text{vmlinux} \rightarrow \text{Image} \rightarrow \text{zImage} \rightarrow \text{uImage} $$ 注意:bzImage的生成也是类似,但主要用于x86架构,而且是Image压缩后加上解压缩代码,结构上有所不同。 回答中需要引用时,我们根据之前的引用号进行标注。由于用户提供的引用有两个,我们只引用了与问题直接相关的部分。 现在,按照要求,用中文回答,并生成相关问题。 </think>### uImagezImage 深度解析 #### 📜 **基本定义** 1. **zImage** - **本质**:压缩的内核镜像文件 - **生成过程**: $$ \text{vmlinux} \xrightarrow{\text{objcopy}} \text{Image} \xrightarrow{\text{gzip压缩}} \text{zImage} $$ - **特点**: - 最大尺寸限制:约 8MB(ARM/MIPS架构)[^1] - 加载方式:单一连续块加载 - 适用架构:ARM, MIPS 等 2. **uImage** - **本质**:U-Boot 专用的封装格式 - **结构**:$$ \text{uImage} = \text{zImage} + \text{64字节U-Boot头} $$ - **特点**: - 头部包含:加载地址, 入口地址, CRC校验等信息[^1] - 支持U-Boot命令直接启动(`bootm`命令) - 专用于嵌入式系统引导 --- #### ⚖️ **核心差异对比** | **特性** | zImage | uImage | |------------------|---------------------------------|---------------------------------| | **封装格式** | 纯压缩内核 | zImage + U-Boot头 | | **头部信息** | 无 | 64字节元数据 (地址/校验等)[^1] | | **最大尺寸** | ~8MB (ARM/MIPS) | 同zImage(受U-Boot内存限制) | | **引导方式** | 需Bootloader解析 | U-Boot直接支持 (`bootm`命令) | | **适用加载器** | GRUB, LILO等通用引导程序 | **仅U-Boot** | | **文件大小** | 较小 | zImage + 64字节 | --- #### ⚙️ **生成过程详解** ```mermaid graph LR A[vmlinux] --> B[objcopy生成Image] B --> C[gzip压缩生成zImage] C --> D[添加U-Boot头] D --> E[uImage] ``` 1. **zImage生成命令**: ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage ``` 2. **uImage生成步骤**: ```bash mkimage -A arm -O linux -T kernel -C gzip \ -a 0x8000 -e 0x8000 -n "Linux Kernel" \ -d zImage uImage ``` - `-a`:加载地址 - `-e`:入口地址 - `-C`:压缩类型(gzip)[^1] --- #### 🌐 **使用场景对比** | **场景** | **推荐格式** | **原因** | |-------------------------|--------------|------------------------------| | U-Boot引导的嵌入式系统 | ✅ uImage | 原生支持,简化启动流程 | | PC/服务器系统 | ✅ zImage | GRUB等引导程序兼容性好 | | 内核调试开发 | ✅ zImage | 生成更快,无需额外封装步骤 | | 空间受限的IoT设备 | ✅ zImage | 节省64字节头部空间[^2] | | 安全启动场景 | ✅ uImage | CRC校验增强完整性验证[^1] | > 💡 **典型案例**: > - Raspberry Pi:默认使用zImage(通过config.txt引导) > - 工业控制板:使用uImage配合U-Boot启动 > - 嵌入式Linux开发板:uImage(如i.MX6系列) --- #### ⚠️ **注意事项** 1. **地址匹配**: uImage头部指定的入口地址(`-e`)必须与内核链接地址一致,否则启动失败。 2. **版本兼容**: 高版本U-Boot可能弃用uImage(改用`bootz`命令加载zImage) 3. **转换工具**: `mkimage`工具需从U-Boot工具链安装: ```bash sudo apt-get install u-boot-tools ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值