2.bootm命令的实现 /* common/cmd_bootm.c */ 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 = 0x400000; int i, verify; char *name, *s; int (*aool)(int, char *[]); image_header_t *hdr = &header; s = getenv("verify"); verify = (s && (*s == 'n')) ? 0 : 1); if (argc < 2){ addr = load_addr; } else { addr = simple_strtoul(argv[1], NULL, 16); } SHOW_BOOT_PROGRESS(1); printf("## Bootingn image at %08lx .../n", addr); /* Copy header so we can blank CRC field for re-calculation */ memmove(&header, (char *)addr, sizeof(image_header_t)); if (ntohl(hdr->ih_magic) != IH_MAGIC) { puts("Bad Magic Number/n"); SHOW_BOOT_PROGRESS(-1); return 1; } SHOW_BOOT_PROGRESS(2); data = (ulong)&header; len = sizeof(image_header_t); checksum = ntohl(hdr->ih_hcrc); hdr->ih_hcrc = 0; if (crc32(0, (char *)data, len) != checksum) { puts("Bad Header Checksum/n"); SHOW_BOOT_PROGRESS(-2); return 1; } SHOW_BOOT_PROGRESS(3); /* for multi-file images we need the data part, too */ print_image_hdr((image_header_t *)addr); data = addr + sizeof(image_header_t); len = ntohl(hdr->ih_size); if (verify) { puts(" Verifying Checksum ... "); if (crc32(0, (char *)data, len) != ntohl(hdr->ih_dcrc)) { printf("Bad Data CRC/n"); SHOW_BOOT_PROGRESS(-3); return 1; } printf("OK/n"); } SHOW_BOOT_PROGRESS(4); len_ptr = (ulong *)data; ... switch (hdr->ih_os) { default: /* handled by (original) Linux case */ case IH_OS_LINUX: do_bootm_linux(cmdtp, flag, argc, argv, addr, len_ptr, verify); break; ... } } bootm命令调用do_bootm函数。这个函数专门用来引导各种操作系统映像,可以支持引导Linux,vxWorks,QNX等操作系统。 引导Linux的时候,调用do_bottom_linux()函数。