资源描述:
《u-boot命令内核浅析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、u-bootbootm命令浅析bootm命令浅析与boom命令实现有关的源文件主要为common/cmd_bootm.c和lib_arm/armlinux.c。下面就这两个文件中的关键代码段进行分析。common/cmd_bootm.c(前面数字为SourceInsight中显示的行号):168if(argc2){addr=load_addr;}else{addr=simple_strtoul(argv[1],NULL,16);}判断运行bootm时是否指定了程序加载地址,若没有则使用默认的加载地址,load_ad
2、dr在cmd_bootm.c中是这样定义的:ulongload_addr=CFG_LOAD_ADDR;183memmove(&header,(char*)addr,sizeof(image_header_t));将使用uboot工具mkimage添加到映象文件头部的64字节提取到image_header_t结构变量header中。。185if(ntohl(hdr-ih_magic)!=IH_MAGIC){#ifdef__I386__if(fake_header(hdr,(void*)addr,-1)!=NULL){
3、addr-=sizeof(image_header_t);verify=0;}else#endif{puts("BadMagicNumber");SHOW_BOOT_PROGRESS(-1);return1;}}判断文件头中的幻数是否为IH_MAGIC,所以如果不是u-boot镜像格式,会输出提示信息”BadMagicNumber”204data=(ulong)&header;len=sizeof(image_header_t);checksum=ntohl(hdr-ih_hcrc);hdr-ih_hcrc=0
4、;if(crc32(0,(uchar*)data,len)!=checksum){puts("BadHeaderChecksum");SHOW_BOOT_PROGRESS(-2);return1;}比对u-bootimage文件头的CRC32校验和。229data=addr+sizeof(image_header_t);len=ntohl(hdr-ih_size);if(verify){puts("VerifyingChecksum...");if(crc32(0,(uchar*)data,len)!=ntoh
5、l(hdr-ih_dcrc)){printf("BadDataCRC");SHOW_BOOT_PROGRESS(-3);return1;}puts("OK");}比对u-bootimage数据部分的校验和。245#ifdefined(__PPC__)if(hdr-ih_arch!=IH_CPU_PPC)#elifdefined(__ARM__)if(hdr-ih_arch!=IH_CPU_ARM)…#else#errorUnknownCPUtype#endif这部条件编译指令检验检验imageheader中
6、的arch类型是否是否正确。275switch(hdr-ih_type){…caseIH_TYPE_KERNEL:name="KernelImage";break;…default:printf("WrongImageTypefor%scommand",cmdtp-name);SHOW_BOOT_PROGRESS(-5);return1;}判断image的类型,这里只列出了KernelImage类型的代码,直接break,:)switch(hdr-ih_comp){…caseIH_COMP_GZIP:print
7、f("Uncompressing%s...",name);if(gunzip((void*)ntohl(hdr-ih_load),unc_len,(uchar*)data,&len)!=0){puts("GUNZIPERROR-mustRESETboardtorecover");SHOW_BOOT_PROGRESS(-6);do_reset(cmdtp,flag,argc,argv);}break;?default:if(iflag)enable_interrupts();printf("Unimplement
8、edcompressiontype%d",hdr-ih_comp);SHOW_BOOT_PROGRESS(-7);return1;}puts("OK");这段代码比较重要,它根据image所采用的压缩类型,将image解压到hdr-ih_load指向的地址,这个ih_load就是在mkimage中的-a选项指定的地址,这下明白了,-a选项指定的是内核