Linux学习笔记——Linux内核镜像格式概述

Linux内核镜像格式概述

  • 什么是“镜像格式”?
    • Linux 内核镜像格式有哪些?
    • 一、vmlinux —— 编译生成的原始内核(可执行ELF)
      • 1. 定义
      • 2. 特点
      • 3. 作用
    • 二、vmlinuz —— vmlinux 的压缩版(gzip)
      • 1. 定义
      • 2. 特点
      • 3. 使用场景
    • 三、Image —— 标准的内核二进制镜像(未压缩)
      • 1. 定义
      • 2. 特点
      • 3. 构建方式
      • 4. 使用场景
    • 四、zImage —— 压缩内核镜像(gzip + 解压器)
      • 1. 定义
      • 2. 特点
      • 3. 为什么需要压缩?
      • 4. 构建方式
      • 5. 使用场景
    • 五、uImage —— U-Boot 可识别的内核镜像
      • 1. 定义
      • 2. mkimage 工具
      • 3. 构建方式
      • 4. 使用场景
    • 六、u-boot 和 u-boot.bin 的区别
      • 1. u-boot(ELF 格式)
      • 2. u-boot.bin(二进制格式)
    • 总结与对比表
    • 面试实用表达(建议背诵)

什么是“镜像格式”?

在嵌入式开发、操作系统开发中,经常提到“镜像(Image)”这个词。所谓“镜像”,指的是一个可执行文件或者系统映像,它包含了某个程序、操作系统、或某个组件的完整可运行形态,包括指令、数据、头信息、符号表等等。镜像就是你最终要烧录进板子(Flash 或 eMMC 等存储器)中用来启动和运行的程序。


Linux 内核镜像格式有哪些?

从功能和使用角度,我们可以将 Linux 内核镜像格式划分为以下几类:

镜像名称 格式 是否压缩 可否直接烧录 是否供调试 是否适用于 U-Boot 备注
vmlinux ELF 编译生成的原始内核
vmlinuz gzip 压缩版内核
Image 二进制 取决于U-Boot配置 标准镜像格式
zImage gzip 有些U-Boot支持 Image的压缩版
uImage gzip + header 是(通用支持) U-Boot专用格式
u-boot ELF bootloader本体
u-boot.bin binary 供烧录的Bootloader

下面,我们逐一详细讲解每种格式的特点、产生过程和使用场景:


一、vmlinux —— 编译生成的原始内核(可执行ELF)

1. 定义

  • vmlinux 是内核源代码经过编译后生成的 最原始的、完整的ELF可执行文件
  • 它包含:内核指令、数据段、调试符号(Symbol Table)、节区信息等。
  • 是用于内核调试的重要文件。

2. 特点

  • 未压缩,体积非常大(几十MB甚至上百MB)。
  • 不能用于启动或烧录
  • 可以用 readelfnmobjdump 查看其结构和符号。
  • vmlinuxzImageImageuImage 的基础文件。

3. 作用

  • 用于内核调试,比如使用 GDB。
  • 用于生成其他可烧录格式的中间产物。

二、vmlinuz —— vmlinux 的压缩版(gzip)

1. 定义

  • vmlinuzvmlinux 压缩后的版本,常见于 PC 的 Linux 系统中。
  • 压缩算法常为 gzip,也有使用 bzip2xz

2. 特点

  • 通常位于 /boot/ 目录下,作为引导项之一。
  • 压缩后体积显著缩小。
  • 一般由 make install 自动生成。

3. 使用场景

  • 用于标准 PC 系统中,如 Debian、Ubuntu 的 GRUB 启动项。
  • 不能用于嵌入式系统的烧录,因为其不是原生可执行镜像。

三、Image —— 标准的内核二进制镜像(未压缩)

1. 定义

  • Imagevmlinux 去除调试符号后生成的、可用于烧录的镜像文件,格式为裸二进制文件(raw binary)。

2. 特点

  • 内核编译后,用于部署的正式版本
  • 不能直接运行于 Linux 系统下,但可以烧录到目标设备上。

3. 构建方式

通常使用以下命令生成:

$ make ARCH=arm CROSS_COMPILE=arm-linux- Image

4. 使用场景

  • 直接烧录到 Flash、eMMC、iNAND 等硬件存储器中。
  • 某些 U-Boot 支持直接加载 Image(需 U-Boot 配置支持)。

四、zImage —— 压缩内核镜像(gzip + 解压器)

1. 定义

  • zImage 是对 Image 进行 gzip 压缩后再加上一个自解压模块的结果。

2. 特点

  • 内部结构:前段为解压器(小型loader),后段为压缩后的Image。
  • 加载到内存后会自动解压并跳转执行

3. 为什么需要压缩?

  • 历史原因:Image 太大,1.44MB软盘装不下
  • 嵌入式系统受存储空间限制,压缩可减小占用空间,提高传输效率。

4. 构建方式

$ make ARCH=arm CROSS_COMPILE=arm-linux- zImage

5. 使用场景

  • 某些支持 zImage 的 U-Boot 可直接引导。
  • 一般情况下需要进一步加工为 uImage 才能被 U-Boot 识别。

五、uImage —— U-Boot 可识别的内核镜像

1. 定义

  • uImage 是在 zImage 的基础上通过 mkimage 工具加工得到的格式。
  • 加工过程:在 zImage 前加上 64 字节的 U-Boot 头部信息。

2. mkimage 工具

来自 U-Boot 的工具链,作用是给镜像添加头部,使得 U-Boot 能识别。
安装方法:

$ cd u-boot/tools
$ cp mkimage /usr/local/bin/

3. 构建方式

$ make ARCH=arm CROSS_COMPILE=arm-linux- uImage

或手动:

$ mkimage -A arm -O linux -T kernel -C gzip -a 0x30008000 -e 0x30008000 -n "Linux Kernel" -d zImage uImage

参数说明:

  • -A:架构(arm)
  • -O:操作系统(linux)
  • -T:镜像类型(kernel)
  • -C:压缩方式(gzip)
  • -a:加载地址
  • -e:入口地址
  • -n:镜像名字
  • -d:镜像数据来源(zImage)

4. 使用场景

  • 几乎所有使用 U-Boot 的嵌入式系统都使用 uImage。
  • 通常 U-Boot 命令:
bootm 0x30008000

六、u-boot 和 u-boot.bin 的区别

1. u-boot(ELF 格式)

  • 是 U-Boot bootloader 源码编译后生成的 ELF 可执行程序。
  • 可用于 Linux 系统下模拟或调试。

2. u-boot.bin(二进制格式)

  • 是将 u-boot 通过 objcopy 转换为 binary 格式,去掉符号表、节区信息后形成的裸镜像。
  • 这是实际烧录到设备中的 bootloader。

转换命令:

arm-linux-objcopy -O binary u-boot u-boot.bin

总结与对比表

名称 类型 是否压缩 是否带符号表 主要用途 是否可烧录 是否可用于U-Boot启动
vmlinux ELF 调试分析
vmlinuz gzip PC系统引导
Image binary 可用于烧录 可能支持
zImage gzip+自解压 节省空间,快速启动 部分支持
uImage zImage+头 U-Boot标准启动格式 全面支持
u-boot ELF Bootloader调试
u-boot.bin binary 烧录到Flash

面试实用表达(建议背诵)

  1. 什么是 vmlinux?

    • vmlinux 是内核编译生成的最原始版本,包含完整的指令和数据段,但不适合直接烧录使用。
  2. 为什么需要 zImage?

    • zImageImage 的压缩版,压缩后大小更适合内存受限的嵌入式设备,且自带解压器,启动时自动解压。
  3. uImage 和 u-boot.bin 的区别是什么?

    • uImage 是 U-Boot 支持的内核镜像格式,包含自解压模块及头信息;而 u-boot.bin 是 Bootloader 本身的二进制镜像。

你可能感兴趣的:(学习笔记,Linux,嵌入式,linux,学习,笔记)