Linux系统移植8:uboot启动流程详解-main_loop到cmd_process处理过程
run_main_loop 函数
在U-Boot启动流程中,run_main_loop
是负责执行U-Boot主循环的关键函数,通常在 board_init_r
的末尾被调用。
1. 函数作用
run_main_loop()
的核心职责是:
- 处理启动延迟:检查
bootdelay
环境变量,倒计时等待用户中断(如按键)。 - 执行自动启动:若倒计时结束未被中断,自动加载并启动内核。
- 进入命令行:若用户中断(如按回车键),进入交互式命令行接收用户指令。
- 持续监听命令:循环处理用户输入的U-Boot命令(如
bootm
、setenv
等)。
以下是其源码部分:
其内部主要函数调用关系如下:
run_main_loop
-> main_loop
-> bootdelay_process 获取bootdelay的值,然后保存到stored_bootdelay 全局变量里面,获取bootcmd环境变量值,并且将其返回
-> autoboot_command 参数是bootcmd的值。
-> abortboot 参数为boot delay,此函数会处理倒计时
-> abortboot_normal 参数为boot delay,此函数会处理倒计时
阶段 | 动作 | 触发条件 |
---|---|---|
启动倒计时 | 显示 Hit any key to stop autoboot |
bootdelay > 0 |
用户中断 | 进入 U-Boot > 命令行 |
倒计时期间检测到按键 |
自动启动 | 执行 bootcmd 环境变量命令 |
倒计时结束无中断 |
命令循环 | 持续接收并执行用户命令 | 进入命令行后 |
cli_loop函数
在 uboot 中,cli_loop
函数是命令行处理的核心函数,负责实现交互式命令行的所有功能。
1. 功能作用
cli_loop()
是 U-Boot 的命令行主循环,主要实现:
- 交互式命令行:持续接收用户输入(如
bootm
、setenv
等命令)。 - 命令解析与执行:解析输入的命令并调用对应的处理函数。
- 特殊功能支持:支持命令补全(Tab)、历史记录(上下键)、环境变量替换(
${var}
)。 - 脚本处理:支持执行预定义的脚本命令(如
bootcmd
)。
以下是其源码部分:
其内部主要函数调用关系如下:
cli_loop uboot命令模式处理函数。
-> parse_file_outer
-> parse_stream_outer
-> parse_stream 解析输入的字符,得到命令
-> run_list 运行命令
-> run_list_real
-> run_pipe_real
-> cmd_process 处理命令,也就是执行命令
关键特性
特性 | 实现方式 |
---|---|
命令补全 | 按 Tab 触发 cmd_auto_complete() (需配置 CONFIG_AUTO_COMPLETE ) |
历史记录 | 上下键调用 hist_add() 和 hist_get() (需配置 CONFIG_CMDLINE_EDITING ) |
环境变量替换 | 解析时展开 ${var} → 实际值(如 ${loadaddr} → 0x80008000 ) |
多命令执行 | 支持分号分隔(setenv ip 192.168.1.1; ping ${ip} ) |
cmd_process函数
在uboot 中,cmd_process
是命令行处理的核心函数之一,负责执行具体的命令解析和执行流程。下面是详细解析:
1. 功能作用
cmd_process()
是 U-Boot 命令执行的核心引擎,主要功能包括:
- 命令解析:分割命令行输入为命令名和参数
- 命令查找:在 U-Boot 命令表中查找匹配的命令
- 命令执行:调用命令对应的处理函数
- 结果处理:处理命令返回值并处理错误
源码如下:
核心结构体: