版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38954835/article/details/88990910
uboot源码分析
1、ARM SOC启动流程
- BL0:第一阶段启动代码,固化在SOC片内ROM中,不可修改;
- BL1:上电启动第二阶段,在BL0阶段被加载至SRAM中,对应于u-boot的SPL阶段;
- BL2:上电启动第三阶段,在BL1阶段被加载至SDRAM中,对应于u-boot的uboot阶段。
2、main_loop()调用流程概述
/* u-boot-2019.04 */
u-boot-spl.lds(/arch/arm/cpu)
..............|→_start(/arch/arm/lib/vectors.S)
......................|→reset(/arch/arm/cpu/arm920t/start.S)
.............................|→cpu_init_crit(/arch/arm/cpu/arm920t/start.S)
............................................|→lowlevel_init(/arch/arm/cpu/mach-xx/lowlevel_init.S)
.............................|→_main(/arch/arm/lib/crt0.S)
....................................|→board_init_f_alloc_reserve(/common/init/board_init.c)
....................................|→board_init_f_init_reserve(/common/init/board_init.c)
....................................|→board_init_f
....................................|→board_init_r
.................................................|→initcall_run_list
...................................................................|→run_main_loop
.................................................................................|→main_loop
/* u-boot-2010.03 */
u-boot.lds
.........|→_start(/cpu/arm920t/start.S)
................|→start_code(/cpu/arm920t/start.S)
...........................|→cpu_init_crit(/cpu/arm920t/start.S)
.........................................|→lowlevel_init(lowlevel_init.S)
...........................|→_start_armboot(/cpu/arm920t/start.S)
..........................................|→start_armboot(/lib_arm/board.c)
........................................................|→main_loop(/common/main.c)
3、uboot解析用户命令的两种方式分析
/* u-boot-2010.03代码片段 */
#ifdef CONFIG_SYS_HUSH_PARSER //用户命令解析方式一:hush方式
parse_file_outer();
/* This point is never reached */
for (;;);
#else //用户命令解析方式二
for (;;) {
...
...
...
len = readline (CONFIG_SYS_PROMPT);
flag = 0; /* assume no special flags for now */
if (len > 0)
strcpy (lastcommand, console_buffer);
else if (len == 0)
flag |= CMD_FLAG_REPEAT;
...
...
...
if (len == -1)
puts ("<INTERRUPT>\n");
else
rc = run_command (lastcommand, flag);
if (rc <= 0) {
/* invalid command or not repeatable, forget it */
lastcommand[0] = 0;
}
}
#endif /*CONFIG_SYS_HUSH_PARSER*/
3.1、方式一
parse_file_outer
...............|→parse_stream_outer
..................................|→run_list
............................................|→run_list_real
..........................................................|→run_pipe_real
........................................................................|→cmdtp->cmd
3.2、方式二
readline
.......|→readline_into_buffer //read data to consol_buffer
run_command
..........|→parse_line //parse command line
..........|→find_cmd //find out command from command table
..........|→cmdtp->cmd