• (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       */
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐