int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
ulong iflag;
ulong addr;
ulong data, len, checksum;
ulong *len_ptr;
uint unc_len = CFG_BOOTM_LEN;
int i, verify;
char *name, *s;
int (*appl)(int, char *[]);
image_header_t *hdr = &header;
/*为是否对镜像头做校验做准备,读取uboot的环境变量verify,
如果环境变量verify等于’n’,则局部变量verify赋值成为0;如果环境变量verify为空(即没有
定义环境变量verify)或者环境变量verify不等于’n’,则局部变量verify赋值成为1
*/
s = getenv ("verify");
verify = (s && (*s == 'n')) ? 0 : 1;
if (argc < 2) //获取镜像存放的内存首地址,如果参数个数小于2(即只是输入了bootm),使用缺省加载地址CFG_LOAD_ADDR。
{
addr = load_addr;
}
else //否则使用第二个参数作为加载地址
{
addr = simple_strtoul(argv[1], NULL, 16);
}
SHOW_BOOT_PROGRESS (1);
printf ("## Booting image at %08lx ...\n", addr);
/* Copy header so we can blank CRC field for re-calculation */
#ifdef CONFIG_HAS_DATAFLASH
if (addr_dataflash(addr)){
read_dataflash(addr, sizeof(image_header_t), (char *)&header);
} else
#endif
//从镜像内存首地址读取镜像头部,为下面的分析校验做准备
memmove (&header, (char *)addr, sizeof(image_header_t));
//判断内核头部编号属性是否为IH_MAGIC,如果不是u-boot镜像识别的内核镜像格式,会输出提示信息”Bad Magic Number”
if (ntohl(hdr->ih_magic) != IH_MAGIC)
{
#ifdef __I386__ /* correct image format not implemented yet - fake it */
if (fake_header(hdr, (void*)addr, -1) != NULL)
{
/* to compensate for the addition below */
addr -= sizeof(image_header_t);
/* turnof verify,
* fake_header() does not fake the data crc
*/
verify = 0;
}
else
#endif /* __I386__ */
{
puts ("Bad Magic Number\n");
SHOW_BOOT_PROGRESS (-1);
return 1;
}
}
SHOW_BOOT_PROGRESS (2);
data = (ulong)&header;
len = sizeof(image_header_t);
//对内核的镜像头部做CRC检验
checksum = nto
do_bootm()函数个人注释
最新推荐文章于 2024-08-19 20:19:38 发布
本文详细解读了Linux内核中的do_bootm()函数,介绍了其在系统启动过程中的关键作用,包括如何加载和启动内核映像,以及与设备树的关系。通过对函数的逐行注释和流程分析,帮助读者深入理解该函数的工作原理。
摘要由CSDN通过智能技术生成