U-Boot启动过程(国嵌2440
培训
焊锡培训资料ppt免费下载焊接培训教程 ppt 下载特设培训下载班长管理培训下载培训时间表下载
)开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot启动函数。看一下board/smdk2410/这个链接脚本,可以知道目标程序的各部分链接顺序。第一个要链接的是cpu/arm920t/,那么U-Boot的入口指令一定位于这个程序中。下面分两阶段介绍启动流程:第一阶段1.cpu/arm920t/这个汇编程序是U-Boot的入口程序,开头就是复位向量的代码。_start:breset1f.*/addr0,r0,#4cmpr0,r1bneclbss_l/*跳转到start_armboot函数入口,_start_armboot字保存函数入口指针*/ldrpc,_start_armboot_start_armboot:.
word
word文档格式规范word作业纸小票打印word模板word简历模板免费word简历
start_armboot3c3c.\n",addr);rc=((ulong(*)(int,char[]))addr)(--argc,&argv[1]);/*运行程序*/if(rc!=0)rcode=1;printf("##Applicationterminated,rc=0x%lX\n",rc);/*如果是运行linux,这条指令是否能运行?*/returnrcode;}go命令调用do_go()函数,跳转到某个地址执行的。如果在这个地址准备好了自引导的内核映像,就可以启动了。尽管go命令可以带变参,实际使用时不用来传递参数。2.bootm命令的实现/*common/*/intdo_bootm(cmd_tbl_t*cmdtp,intflag,intargc,char*argv[]){/*检查头部*/if(crc32(0,(uchar*)data,len)!=checksum){puts("BadHeaderChecksum\n");SHOW_BOOT_PROGRESS(-2);return1;}/*解压缩*/switch(hdr->ih_comp){caseIH_COMP_NONE:if(ntohl(hdr->ih_load)==addr){printf("XIP%s...",name);}else{#ifdefined(CONFIG_HW_WATCHDOG)||defined(CONFIG_WATCHDOG)size_tl=len;void*to=(void*)ntohl(hdr->ih_load);void*from=(void*)data;printf("Loading%s...",name);while(l>0){size_ttail=(l>CHUNKSZ)?CHUNKSZ:l;WATCHDOG_RESET();memmove(to,from,tail);to+=tail;from+=tail;l-=tail;}#else/*!(CONFIG_HW_WATCHDOG||CONFIG_WATCHDOG)*/memmove((void*)ntohl(hdr->ih_load),(uchar*)data,len);#endif/*CONFIG_HW_WATCHDOG||CONFIG_WATCHDOG*/}break;caseIH_COMP_GZIP:printf("Uncompressing%s...",name);if(gunzip((void*)ntohl(hdr->ih_load),unc_len,(uchar*)data,&len)!=0){puts("GUNZIPERROR-mustRESETboardtorecover\n");SHOW_BOOT_PROGRESS(-6);do_reset(cmdtp,flag,argc,argv);}break;#ifdefCONFIG_BZIP2caseIH_COMP_BZIP2:printf("Uncompressing%s...",name);/*Ifwe'vegotlessthan4MBofmalloc()space,useslowerdecompressionalgorithmwhichrequiresatmost2300KBofmemory.*/=BZ2_bzBuffToBuffDecompress((char*)ntohl(hdr->ih_load),&unc_len,(char*)data,len,CFG_MALLOC_LEN<(4096*1024),0);if(i!=BZ_OK){printf("BUNZIP2ERROR%d-mustRESETboardtorecover\n",i);SHOW_BOOT_PROGRESS(-6);udelay(100000);do_reset(cmdtp,flag,argc,argv);}break;#endif/*CONFIG_BZIP2*/default:if(iflag)enable_interrupts();printf("Unimplementedcompressiontype%d\n",hdr->ih_comp);SHOW_BOOT_PROGRESS(-7);return1;}}switch(hdr->ih_os){default:/*handledby(original)Linuxcase*/caseIH_OS_LINUX:do_bootm_linux(cmdtp,flag,argc,argv,addr,len_ptr,verify);break;caseIH_OS_NETBSD:do_bootm_netbsd(cmdtp,flag,argc,argv,addr,len_ptr,verify);break;caseIH_OS_RTEMS:do_bootm_rtems(cmdtp,flag,argc,argv,addr,len_ptr,verify);break;caseIH_OS_VXWORKS:do_bootm_vxworks(cmdtp,flag,argc,argv,addr,len_ptr,verify);break;caseIH_OS_QNX:do_bootm_qnxelf(cmdtp,flag,argc,argv,addr,len_ptr,verify);break;}bootm命令调用do_bootm函数。这个函数专门用来引导各种操作系统映像,可以支持引导Linux、vxWorks、QNX等操作系统。引导Linux的时候,调用do_bootm_linux()函数。3.do_bootm_linux函数的实现/*lib_arm/*/voiddo_bootm_linux(cmd_tbl_t*cmdtp,intflag,intargc,char*argv[],ulongaddr,ulong*len_ptr,intverify){theKernel=(void(*)(int,int,uint))ntohl(hdr->ih_ep);/*weassumethatthekernelisinplace*/printf("\nStartingkernel...\n\n");theKernel(0,bd->bi_arch_number,bd->bi_boot_params);/*启动内核,传递启动参数*/}do_bootm_linux()函数是专门引导Linux映像的函数,它还可以处理ramdisk文件系统的映像。这里引导的内核映像和ramdisk映像,必须是U-Boot
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
的。U-Boot格式的映像可以通过mkimage工具来转换,其中包含了U-Boot可以识别的符号。