位于nand中的内核是uImang格式,其结构为头部加上真正的内核,头部对应的类型为:
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;
这里我们主要关注 uint32_t ih_load; /* Data Load Address */
和
uint32_t ih_ep; /* Entry Point Address */
一个是加载地址,一个是入口地址,用bootm命令加载内核时,会读出这两个地址,
如果bootm命令后面的地址与真正内核所处地址不同,则需要将真正内核移到bootm 命令后面的地址。
其中头部image_header_t的大小为64byte.
为了不移动内核以便加快系统启动速度,可以将nand read 内存地址设为bootm 命令后面的地址减去64byte.
bootm 所做的工作:
1. 根据头部的ih_load 移动内核到合适的地方
2. 启动内核,do_bootm_linux,此处uboot会通过约定的格式 设置一些内核的启动参数,内核启动时会按这种格式读取参数。