0%

kernel 内核 uIamge 与 zImage 区别

Linux 编译可以生成 uImageImage 以及 zImage 内核,其中 uImageuboot 专用内核映像文件

内核编译

Linux 内核编译默认生成 ImagezImage,其中 Image 为内核映像文件,而 zImage 为内核的一种映像压缩文件

uImageuboot 专用的映像文件,是在 zImage 之前加上一个长度为 64 字节的头,说明这个内核的版本、加载位置、生成时间、大小等信息;其 0x40 之后与 zImage 没区别,64 字节头部结构如下

typedef struct image_header {
    uint32_tih_magic;
    uint32_tih_hcrc;
    uint32_tih_time;
    uint32_tih_size;
    uint32_tih_load;
    uint32_tih_ep;
    uint32_tih_dcrc;
    uint8_tih_os;
    uint8_tih_arch;
    uint8_tih_type;
    uint8_tih_comp;
    uint8_tih_name[IH_NMLEN];
} image_header_t;

zImagevmlinux objcopy 出来的纯二进制文件以及解压缩程序组成, zImage 自带了解压缩程序

uImagezImage 都是压缩后的内核映像。而 uImage 是用 mkimage 工具 根据 zImage 制作而来的

编译 uImage 需要指定 make ARCH=arm CROSS_COMPILE=arm-linux- uImage LOADADDR=0x8000

LOADADDR

当编译 uImage 时需要指定一个参数 LOADADDR,指定内核映像所在的地址,对于 arm 来将这个是惯例

Despite the ability to place zImage anywhere within memory, convention has it that it is loaded at the base of physical RAM plus an offset of 0x8000 (32K). This leaves space for the parameter block usually placed at offset 0x100, zero page exception vectors and page tables. This convention is very common.

Ref

  1. Image uImage zImage U-Boot 的区别
  2. Building kernel uImage using LOADADDR
  3. Booting ARM Linux