u-boot流程分析
[toc] U-Boot 启动流程lds链接脚本 从链接脚本中定义了ENTRY(_start),即开始入口为_start _start函数 arch/arm/lib/vectors_m.S 编译的时候设置中断向量表 顺序执行下去,执行了reset函数 reset函数 arch/arm/cpu/armv7m/start.S 定义了reset函数,跳转到_main _main函数 arch/arm/lib/crt0.S 定义了_main函数 初始化堆栈指针sp为CONFIG_SYS_INIT_SP_ADDR12345678/* 设置初始 C 运行环境并调用 board_init_f(0)*/#if defined(CONFIG_TPL_BUILD) && defined(CONFIG_TPL_NEEDS_SEPARATE_STACK) ldr r0, =(CONFIG_TPL_STACK)#elif defined(CONFIG_XPL_BUILD) &...
u-boot_config
last设置编译引导加载程序VPL(Very Early Program Loader) 功能 :VPL 是 U-Boot 的非常早期引导加载程序,通常用于在极其受限的环境中进行最基本的硬件初始化。 位置 :VPL 通常位于存储设备的固定位置,类似于 SPL 和 TPL。 作用 :VPL 的主要任务是加载并执行 TPL,以便进一步初始化系统并准备加载 SPL。 SPL(Secondary Program Loader) 功能 :SPL 是 U-Boot 的第二阶段引导加载程序,通常用于初始化基本的硬件资源,如内存控制器、时钟和电源管理等。 位置 :SPL 通常位于存储设备的固定位置,如 NAND、NOR 闪存或 SD 卡的特定扇区。 作用 :SPL 的主要任务是加载并执行 U-Boot 的主引导加载程序(即 U-Boot 本身),以便进一步初始化系统并启动操作系统。 TPL(Tertiary Program Loader) 功能 :TPL 是 U-Boot 的第三阶段引导加载程序,通常用于在资源受限的环境中进一步初始化硬件资源。 位置 :TPL 通常位于存储设备的固定位置,类...
api
[TOC] 介绍用于外部应用程序的 U-Boot 机器/独立于架构的 API 主要假设 API 只有一个入口点 (syscall) 根据当前的设计,syscall 是 U-Boot 中的 C 语言可调用函数text,它可能会演变成一个真正的 syscall using machine exception 陷阱,一旦此初始版本证明有效 使用者应用程序负责生成适当的上下文(调用 number 和参数) 进入后,系统调用将调用分派给其他(现有的)U-Boot功能区域,如网络或存储操作 消费者应用程序将通过搜索来识别 API 可用指定的(按照约定假定的)地址空间范围签名 API 的 U-Boot 组成部分是精简且非侵入性的,将尽可能多的处理留给消费者应用程序端,例如,它不保留状态,而是依赖于来自应用程序的提示,并且以此类推 可选 (CONFIG_API) 调用 控制台相关(GETC、PUTC、TSTC 等) 系统(重置、平台信息) 时间 (delay, current) env vars (枚举所有、get、set) 设备 (枚举所有、打开、关闭、读...
arch
[TOC] arch 架构介绍ARC (Argonaut RISC Core) ARC 是一种基于 RISC(精简指令集计算机)原理的处理器架构,广泛应用于嵌入式系统中。 ARC 处理器由 Synopsys 公司开发和推广,广泛应用于嵌入式系统中,因其高性能和低功耗特性而受到欢迎。 ARM ARM M68K M68K,也称为 68K 或 Motorola 68000,是一种由摩托罗拉公司(Motorola)开发的16/32位微处理器架构。M68K 系列处理器在20世纪80年代和90年代广泛应用于计算机、嵌入式系统和游戏机中。 MICROBLAZE MicroBlaze 是由 Xilinx 公司开发的一种软处理器核心,专门用于其 FPGA(现场可编程门阵列)产品。MicroBlaze 处理器可以通过硬件描述语言(如 VHDL 或 Verilog)在 FPGA 中实现,并根据具体应用需求进行定制。 MIPS MIPS(Microprocessor without Interlocked Pipeline Stages)是一种由 MIPS Technologies 开...
cmd
[TOC] boot 命令 bootm 是一个通用的引导命令,支持多种镜像格式和加载方式. bootz 专门用于引导压缩的 Linux zImage 内核。 booti 专门用于引导 AArch64 Linux 内核映像。 bootm 从内存中引导应用程序映像 bootm bootz 启动 Linux zImage bootz booti 从内存中引导 AArch64 Linux 内核映像
autoboot
autoboot.cautoboot_command 自动启动命令1234567891011121314151617181920212223242526272829void autoboot_command(const char *s){ debug("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>"); if (s //有bootcmd && (stored_bootdelay == -2 || //有延迟时间,且没有按键中断 (stored_bootdelay != -1 && !abortboot(stored_bootdelay)))) { bool lock; int prev; lock = autoboot_keyed() && !IS_ENABLED(CO...
board
[TOC] init/board_init.cboard_init_f_alloc_reserve 板级初始化第一次分配保留空间12345678910111213141516// //Fast alloc// top:栈顶地址,即堆栈指针地址sp传入ulong board_init_f_alloc_reserve(ulong top){ /* Reserve early malloc arena */#ifndef CFG_MALLOC_F_ADDR //没有定义快速分配地址#if CONFIG_IS_ENABLED(SYS_MALLOC_F) //配置系统自动快速分配 top -= CONFIG_VAL(SYS_MALLOC_F_LEN);#endif#endif /* LAST : 保留 GD (四舍五入为 16 字节的倍数) */ top = rounddown(top-sizeof(struct global_data), 16); return top;} board_init_f_init_reserve 板级初始化第一次始化保留 将传...
cli
CTL_CH 转换为控制字符1#define CTL_CH(c) ((c) - 'a' + 1) 控制字符通常用于表示特定的控制操作,例如回车、换行、退格等。在 ASCII 码表中,控制字符的值通常在 1 到 31 之间。 cli.ccli_init u_boot_hush_start(); 123456789101112int u_boot_hush_start(void){ if (top_vars == NULL) { top_vars = malloc(sizeof(struct variables)); top_vars->name = "HUSH_VERSION"; top_vars->value = "0.01"; top_vars->next = NULL; top_vars->flg_export = 0; top_vars->flg_read_only = 1; } return 0;} cli_process...
command
command.cU_BOOT_CMD12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273#ifdef CONFIG_AUTO_COMPLETE# define _CMD_COMPLETE(x) x,#else# define _CMD_COMPLETE(x)#endif#ifdef CONFIG_SYS_LONGHELP# define _CMD_HELP(x) x,#else# define _CMD_HELP(x)#endif//cmd名称,最大参数个数,是否可重复,cmd调用函数,使用说明,帮助信息#define U_BOOT_CMD(_name, _maxargs, _rep, _cmd, _usage, _help) \ U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, ...
console
common/console.cputs 输出字符串 暂不分析***









