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)。