1. UImage介绍

UImage是为了配合uboot而定义的一种image格式。在原有的image基础之上,mkimage工具会自动添加一个64字节的头部信息供uboot启动系统来使用。

64字节的头部信息定义如下:

/*
 * Legacy format image header,
 * all data in network byte order (aka natural aka bigendian).
 */
typedef struct image_header {
	uint32_t	ih_magic;	/* Image Header Magic Number	*/
	uint32_t	ih_hcrc;	/* Image Header CRC Checksum	*/
	uint32_t	ih_time;	/* Image Creation Timestamp	*/
	uint32_t	ih_size;	/* Image Data Size		*/
	uint32_t	ih_load;	/* Data	 Load  Address		*/
	uint32_t	ih_ep;		/* Entry Point Address		*/
	uint32_t	ih_dcrc;	/* Image Data CRC Checksum	*/
	uint8_t		ih_os;		/* Operating System		*/
	uint8_t		ih_arch;	/* CPU architecture		*/
	uint8_t		ih_type;	/* Image Type			*/
	uint8_t		ih_comp;	/* Compression Type		*/
	uint8_t		ih_name[IH_NMLEN];	/* Image Name		*/
} image_header_t;

里面定义了许多系统镜像相关的 属性,在kernel build的时候会在zImage基础上附加这些信息,行程uImage的头部

2. U-boot 启动UImage

UBOOT和uImage

如上图所示,U-BOOT 在boot image的时候会用到两个load地址,其中一个是固定在u-boot image里或者可以通过env变量来调整的load地址,在boot的过程中,uboot从load下来的uImage里拿到头部指定的uImage的loadaddr然后把uImage拷贝到这个指定的地址。uImage头部的

uboot启动系统image的过程如下

  • 从flash或者network下载image到loadaddr
  • 将uImage从loadaddr搬移到uImage指定的loadaddr
  • PC跳转到uImage header指定的entryaddr,启动系统


相关文章: