uboot使用的内核镜像文件uImage头部64字节信息解析
(1)以下面的uImage为例:(2)该文件大小和创建日期如图所示:(3)该uImage由UE打开后如图所示:(4)其头部的64个字节信息如图:(5)对应的image_header结构体:(6)结合下图对每项结构体成员所对应的值说明(选择其中一部分):“__be32 ih_magic” 成员为镜像魔数。该成员的值为:0x27051956,应该为uImage的头部开始值,根据这个值,判断是否为uIm
- (1)以下面的uImage为例:
(2)该文件大小和创建日期如图所示:
(3)该uImage由UE打开后如图所示:
(4)其头部的64个字节信息如图:
(5)对应的image_header结构体:
/*
* Legacy format image header,
* all data in network byte order (aka natural aka bigendian).
*/
typedef struct image_header {
__be32 ih_magic; /* Image Header Magic Number: 镜像魔数, 0x27051956为
uimage的头部开始值 */
__be32 ih_hcrc; /* Image Header CRC Checksum: 整个64字节头的crc校验码 */
__be32 ih_time; /* Image Creation Timestamp: uImage的创建时间戳 */
__be32 ih_size; /* Image Data Size: zImage镜像的大小 */
__be32 ih_load; /* Data Load Address: 内核加载地址 */
__be32 ih_ep; /* Entry Point Address: zImage的入口位置 = lode + 64,也是
内核运行地址,“theKernel”指向该地址,说明这里藏着进入第一个
函数-解压函数 */
__be32 ih_dcrc; /* Image Data CRC Checksum: 整个zImage的crc校验码 */
uint8_t ih_os; /* Operating System: 操作系统代码 */
uint8_t ih_arch; /* CPU architecture: 芯片类型,cpu架构 */
uint8_t ih_type; /* Image Type: 镜像类型 */
uint8_t ih_comp; /* Compression Type: 压缩类型 */
uint8_t ih_name[IH_NMLEN]; /* Image Name: 32字节的名字 */
} image_header_t;
(6)结合下图对每项结构体成员所对应的值说明(选择其中一部分):
“__be32 ih_magic” 成员为镜像魔数。
该成员的值为:0x27051956,应该为uImage的头部开始值,根据这个值,判断是否为uImage。
“__be32 ih_hcrc” 成员为整个64字节头的crc校验码。
该成员的值为:0x4AFF785E,字节顺序反向,字节起始位置为:从??到??,遵循的校验算法可以查找源码/commom/目录下的Image.c文件中“int image_check_hcrc(const image_header_t *hdr)”函数,另外还有两个内核函数“image_set_hcrc”和“image_get_hcrc”。
“__be32 ih_time” 成员为uImage的创建时间戳。
该成员的值为:0x6058438B,换算成十进制为1616397195,该值为utc时间戳(从1970年1月1日0时0秒0分到现在的秒数),转换为北京时间为2021-3-22,15:13:15,与上面截图的时间基本吻合。
“__be32 ih_size” 成员为整个uImage镜像的大小。
该成员的值为:0x004977A0,换算成十进制为4814752,所以镜像大小为4701.9KB,约为4.59M,与上面截图的文件大小基本吻合。
“__be32 ih_load” 成员为内核加载地址。该成员的值为:0x40008000,为内核加载地址。
“__be32 ih_ep” 成员为内核运行地址。该成员的值为:0x40008000,为zImage的入口位置=lode+64,也是内核运行地址,“theKernel”指向该地址,说明这里藏着进入第一个函数-解压函数
“__be32 ih_dcrc” 成员为整个zImage的crc校验码。
该成员的值为:0xB924C8AE,字节顺序反向,字节起始位置为64个头部字节之后开始计算,遵循的校验算法可以查找源码/commom/目录下的Image.c文件中“int image_check_dcrc(const image_header_t *hdr)”函数,另外还有两个内核函数“image_set_dcrc”和“image_get_dcrc”。
“uint8_t ih_os” 成员为操作系统代码。该成员值为:0x05,代表系统为“Linux”,选择项如下:
/*
* Operating System Codes
*/
#define IH_OS_INVALID 0 /* Invalid OS */
#define IH_OS_OPENBSD 1 /* OpenBSD */
#define IH_OS_NETBSD 2 /* NetBSD */
#define IH_OS_FREEBSD 3 /* FreeBSD */
#define IH_OS_4_4BSD 4 /* 4.4BSD */
#define IH_OS_LINUX 5 /* Linux */
#define IH_OS_SVR4 6 /* SVR4 */
#define IH_OS_ESIX 7 /* Esix */
#define IH_OS_SOLARIS 8 /* Solaris */
#define IH_OS_IRIX 9 /* Irix */
#define IH_OS_SCO 10 /* SCO */
#define IH_OS_DELL 11 /* Dell */
#define IH_OS_NCR 12 /* NCR */
#define IH_OS_LYNXOS 13 /* LynxOS */
#define IH_OS_VXWORKS 14 /* VxWorks */
#define IH_OS_PSOS 15 /* pSOS */
#define IH_OS_QNX 16 /* QNX */
#define IH_OS_U_BOOT 17 /* Firmware */
#define IH_OS_RTEMS 18 /* RTEMS */
#define IH_OS_ARTOS 19 /* ARTOS */
#define IH_OS_UNITY 20 /* Unity OS */
#define IH_OS_INTEGRITY 21 /* INTEGRITY */
#define IH_OS_OSE 22 /* OSE */
#define IH_OS_PLAN9 23 /* Plan 9 */
“uint8_t ih_arch” 成员为芯片类型,cpu架构。
该成员的值为:0x02,代表芯片类型为“ARM”,可选择项如下:
/*
* CPU Architecture Codes (supported by Linux)
*/
#define IH_ARCH_INVALID 0 /* Invalid CPU */
#define IH_ARCH_ALPHA 1 /* Alpha */
#define IH_ARCH_ARM 2 /* ARM */
#define IH_ARCH_I386 3 /* Intel x86 */
#define IH_ARCH_IA64 4 /* IA64 */
#define IH_ARCH_MIPS 5 /* MIPS */
#define IH_ARCH_MIPS64 6 /* MIPS 64 Bit */
#define IH_ARCH_PPC 7 /* PowerPC */
#define IH_ARCH_S390 8 /* IBM S390 */
#define IH_ARCH_SH 9 /* SuperH */
#define IH_ARCH_SPARC 10 /* Sparc */
#define IH_ARCH_SPARC64 11 /* Sparc 64 Bit */
#define IH_ARCH_M68K 12 /* M68K */
#define IH_ARCH_MICROBLAZE 14 /* MicroBlaze */
#define IH_ARCH_NIOS2 15 /* Nios-II */
#define IH_ARCH_BLACKFIN 16 /* Blackfin */
#define IH_ARCH_AVR32 17 /* AVR32 */
#define IH_ARCH_ST200 18 /* STMicroelectronics ST200 */
#define IH_ARCH_SANDBOX 19 /* Sandbox architecture (test only) */
#define IH_ARCH_NDS32 20 /* ANDES Technology - NDS32 */
#define IH_ARCH_OPENRISC 21 /* OpenRISC 1000 */
#define IH_ARCH_ARM64 22 /* ARM64 */
#define IH_ARCH_ARC 23 /* Synopsys DesignWare ARC */
“uint8_t ih_type” 成员为镜像类型。
该成员的值为:0x02,代表镜像类型为“OS Kernel Image”系统内核镜像,可选择项如下:
/*
* Image Types
*/
#define IH_TYPE_INVALID 0 /* Invalid Image */
#define IH_TYPE_STANDALONE 1 /* Standalone Program */
#define IH_TYPE_KERNEL 2 /* OS Kernel Image */
#define IH_TYPE_RAMDISK 3 /* RAMDisk Image */
#define IH_TYPE_MULTI 4 /* Multi-File Image */
#define IH_TYPE_FIRMWARE 5 /* Firmware Image */
#define IH_TYPE_SCRIPT 6 /* Script file */
#define IH_TYPE_FILESYSTEM 7 /* Filesystem Image (any type) */
#define IH_TYPE_FLATDT 8 /* Binary Flat Device Tree Blob */
#define IH_TYPE_KWBIMAGE 9 /* Kirkwood Boot Image */
#define IH_TYPE_IMXIMAGE 10 /* Freescale IMXBoot Image */
#define IH_TYPE_UBLIMAGE 11 /* Davinci UBL Image */
#define IH_TYPE_OMAPIMAGE 12 /* TI OMAP Config Header Image */
#define IH_TYPE_AISIMAGE 13 /* TI Davinci AIS Image */
#define IH_TYPE_KERNEL_NOLOAD 14 /* OS Kernel Image, can run from any load address */
#define IH_TYPE_PBLIMAGE 15 /* Freescale PBL Boot Image */
#define IH_TYPE_MXSIMAGE 16 /* Freescale MXSBoot Image */
#define IH_TYPE_GPIMAGE 17 /* TI Keystone GPHeader Image */
#define IH_TYPE_ATMELIMAGE 18 /* ATMEL ROM bootable Image */
“uint8_t ih_comp” 成员为压缩类型。
该成员的值为:0x00,代表压缩类型为“No Compression Used”无压缩,可选择项如下:
/*
* Compression Types
*/
#define IH_COMP_NONE 0 /* No Compression Used */
#define IH_COMP_GZIP 1 /* gzip Compression Used */
#define IH_COMP_BZIP2 2 /* bzip2 Compression Used */
#define IH_COMP_LZMA 3 /* lzma Compression Used */
#define IH_COMP_LZO 4 /* lzo Compression Used */
“uint8_t ih_name[IH_NMLEN]” 成员,为32字节的名字。
该成员的值在该uImage中为“Linux-3.10.65”,代表了系统的版本号,其他字节为空。
其中IH_NMLEN为宏,定义为32
#define IH_NMLEN 32 /* Image Name Length */
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)