欢迎来到天天文库
浏览记录
ID:39469058
大小:34.50 KB
页数:5页
时间:2019-07-04
《Uboot之hush方式解析用户命令》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、uboot命令解析流程简析uboot正常启动后,会调用main_loop(void)函数,进入main_loop()之后,如果在规定的时间(CONFIG_BOOTDELAY)内,没有检查到任何按键事件的发生,就会去加载OS,并启动系统,比如把linux内核压缩镜像从nandflash中读到sdram,然后执行它。如果在CONFIG_BOOTDELAY时间内,用户按下键盘上的任意一个按键,uboot就会进入与用户交互的状态。如果用户在配置文件中定义了CONFIG_SYS_HUSH_PARSER,就会通过parse_file_outer(),去接收并解析用户命令,否则进入一个for(;;)循环中
2、,通过readline(CONFIG_SYS_PROMPT)接收用户命令,然后调用run_command(cmd,flag)去解析并执行命令。代码如下:voidmain_loop(void){..............................#ifdefCONFIG_SYS_HUSH_PARSERparse_file_outer();/*Thispointisneverreached*/for(;;);#elsefor(;;){#ifdefCONFIG_BOOT_RETRY_TIMEif(rc>=0){/*Sawenoughofavalidcommandto*restartthet
3、imeout.*/reset_cmd_timeout();}#endiflen=readline(CONFIG_SYS_PROMPT);printf("afterreadline:%d",len);flag=0;/*assumenospecialflagsfornow*/if(len>0)strcpy(lastcommand,console_buffer);elseif(len==0)flag
4、=CMD_FLAG_REPEAT;#ifdefCONFIG_BOOT_RETRY_TIMEelseif(len==-2){/*-2meanstimedout,retryautoboot*/puts
5、("Timedoutwaitingforcommand");#ifdefCONFIG_RESET_TO_RETRY/*Reinitboardtoruninitializationcodeagain*/do_reset(NULL,0,0,NULL);#elsereturn;/*retryautoboot*/#endif}#endifif(len==-1)puts("");elserc=run_command(lastcommand,flag);.....................................}如果定义了CONFIG_SYS_HUSH_
6、PARSER,命令接收和解析讲采用busybox中的hush(对应hush.c)工具来实现,与uboot原始的命令解析方法相比,该工具更加智能。这里主要讲uboot中基于hush的命令解析流程。不过hush的实现太过复杂,鉴于自己水平太次,只是简单追踪下流程。当在配置文件中定义了CONFIG_SYS_HUSH_PARSER,main_loop会调用parse_file_outer(),进入hush,然后里面是一大堆和hush相关的机制,暂时不做分析,最终会调用到hush中的run_pipe_real(structpipe*pi),在该函数中经过一些列解析,最终会调用到对应的命令执行函数,代码
7、如下:staticrun_pipe_real(structpipe*pi){........................................rcode=(cmdtp->cmd)(cmdtp,flag,child->argc-i,&child->argv[i]);if(!cmdtp->repeatable)flag_repeat=0;...................................}cmdtp是对应命令的结构指针,cmd就是该命令对应的执行函数指针。在uboot中,对所有的命令,有一个cmd_tbl_t的结构,定义如下:structcmd_tbl_s{ch
8、ar*name;/*CommandName*/intmaxargs;/*maximumnumberofarguments*/intrepeatable;/*autorepeatallowed?*/int(*cmd)(structcmd_tbl_s*,int,int,char*[]);/*Implementationfunction*/char*usage;/*Usagemessage(short)*/#ifd
此文档下载收益归作者所有