1、Image
1.1 什么是 Image
Image
是一种未压缩的 Linux 内核镜像文件,包含了内核的所有代码、数据和必要的元信息。- 它是 Linux 内核在编译过程中生成的一个原始的二进制文件,未经过任何压缩或额外的封装处理。
- 由于未压缩,
Image
文件相对较大,但它不需要解压过程,加载速度较快。
1.2 内部结构
- 头部:包含基本的内核信息(如内核版本、加载地址等),用于引导加载程序识别。
- 内核代码:实际的 Linux 内核代码和数据段。
- 内核数据:初始化和常驻的数据段,包括全局变量、静态变量等。
1.3 工作原理
- 引导加载程序(如 U-Boot、GRUB 等)从存储介质(如 NAND Flash、SD 卡、硬盘等)中读取
Image
文件。 - 将
Image
文件加载到内存中的指定位置(通常是 RAM)。 - 引导加载程序将控制权转交给
Image
的入口地址。 - 内核开始执行初始化过程,设置硬件和系统环境,最终启动用户空间的操作系统。
1.4 编译生成Image
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- Image
2、zImage
2.1 什么是 zImage
zImage
是一种经过压缩的 Linux 内核镜像格式,它通过 gzip
压缩内核代码和数据,使文件大小大大减小。zImage
也称为 “compressed kernel image”,在加载时会自解压缩到内存中然后执行。
2.2 内部结构
- 解压缩头部:包括解压缩代码和一个简单的引导程序,用于引导和解压缩内核。
- 压缩的内核代码和数据:使用
gzip
压缩后的内核代码和数据。 - 尾部校验和:用于验证文件完整性。
2.3 工作原理
- 引导加载程序(如 U-Boot 或其他加载器)从存储介质中读取
zImage
文件。 - 将
zImage
文件加载到内存中。 - 解压缩头部代码运行,解压缩内核到内存中的指定位置。
- 内核解压完成后,控制权转移到解压后的内核入口点,开始内核初始化和启动过程。
2.4 编译生成 zImage
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage
3、uImage
3.1 什么是 uImage
uImage
是 U-Boot 引导加载程序专用的内核镜像格式。- 它是在
zImage
或 Image
的基础上加上一个 U-Boot 头部信息(U-Boot Header),使 U-Boot 能够识别并加载内核镜像。
3.2 内部结构
- U-Boot Header:一个 64 字节的头部信息,其中头部包含的信息可看下文:【Linux】uImage头部信息详细解析-CSDN博客
- 内核镜像:可以是
zImage
、Image
或其他类型的镜像。
3.3 工作原理
- U-Boot 读取
uImage
文件。 - U-Boot 解析头部信息,验证镜像的合法性和完整性。
- 将内核镜像加载到指定的内存地址。
- 如果内核镜像是压缩的,U-Boot 会解压缩它。
- 将控制权交给内核的入口地址,启动 Linux 内核。
3.4 编译生成 uImage
mkimage -A arm -O linux -T kernel -C gzip -a 0x8000 -e 0x8000 -n "Linux Kernel" -d zImage uImage
-A
:目标架构(ARM)。-O
:操作系统(Linux)。-T
:镜像类型(内核)。-C
:压缩类型(gzip)。-a
:加载地址(0x8000)。-e
:入口点地址(0x8000)。-n
:镜像名称("Linux Kernel")。-d
:源文件(zImage
)。