Linux系统移植8:uboot启动流程详解-main_loop到cmd_process处理过程

发布于:2025-06-30 ⋅ 阅读:(23) ⋅ 点赞:(0)

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命令(如 bootmsetenv 等)。

以下是其源码部分:
在这里插入图片描述

其内部主要函数调用关系如下:

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 的命令行主循环,主要实现:

  • 交互式命令行:持续接收用户输入(如 bootmsetenv 等命令)。
  • 命令解析与执行:解析输入的命令并调用对应的处理函数。
  • 特殊功能支持:支持命令补全(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 命令表中查找匹配的命令
  • 命令执行:调用命令对应的处理函数
  • 结果处理:处理命令返回值并处理错误

源码如下:
在这里插入图片描述

核心结构体:
在这里插入图片描述