uboot2015–启动流程分析 imx6q

最近项目原因,要在uboot中增加内核验校和内核损坏修复功能,所以需要回头看看uboot。这次选择了uboot2015来进行分析

uboot是明远睿智提供的。

下载地址 链接:https://pan.baidu.com/s/13SuRii3WTqvFTNIsSS9GAg 密码:65zz

环境:ubuntu16

主控:imx6q

#1、start.s         arch\arm\cpu\armv7\start.S

因为我们这款cpu指令集是armv7的所以选择这个目录下的start.s,如果不知道自己该看那个目录下的start.s,可以用如下方法

先编译uboot,编译成功后,执行  find  -name start.0  即可看见start文件所在目录

然后我们来看看代码,我对代码进行了删减,我们目的在于流程分析,就不分析具体每句话了

arch\arm\lib\crt0.S   _main在这个文件里

 

然后调用了 board_init_r 函数

common\board_r.c

我们来看看这个init_sequence_r  为了更加清晰的看到他的流程,我删减了一部分代码

这里满足宏条件的函数都会被执行,最后一个执行的函数是run_main_loop,我继续追踪下去,这个函数 还是在这个文件中board_r.c

可以看见,这里是单向的,调用了run_main_loop就不会返回了,我们继续看看main_loop();

common\main.c

我们 继续进入到 autoboot_command(s);

 

对于命令的解析执行,我们追踪 run_command_list(s, -1, 0);来分析分析

 

继续追踪parse_string_outer(buff, FLAG_PARSE_SEMICOLON);

这里主要是对命令流进行了分割、执行。我们再继续追踪 parse_stream_outer(&input, flag);

追踪run_list(ctx.list_head);

追踪 run_list_real(pi);

追踪 rcode = run_pipe_real(pi);

 

追踪 cmd_process(flag, child->argc, child->argv, &flag_repeat, NULL);

命令最终在这里被执行,以上一系列过程 将收到的指令通过一系列字符处理然后加入一个执行列表,然后执行这个列表。这些命令的的具体实现大家可以 执行 find -name  ./common/cmd*.c

这些文件里定义了命令的具体实现。

比如我们mmc read xx  xx命令,在common\cmd_mmc.c  :842中,大家可以具体去看看,其实读秒过后的,系统自动执行了一系列环境变量()中保存的命令,执行命令这一套的通用的,只是命令的来源不一样,一个是用户输入的,一个是从环境命令中读取的。我们可以做个实验,在parse_string_outer函数中添加如下代码

然后编译,烧写,启动,观察输出信息

分析到这里想必大家都有了自己想法,剩下的就交给你们去探索了,这里仅仅是个抛砖引玉,做个粗浅的分析,感谢您耐着性子读到这里,哈哈哈~~

lornyin   2018/3/17  原文地址 http://lornyin.top/?p=529

superyin