uboot 启动分析
简介
接下来的几篇文章会简要介绍下uboot的启动流程,本文使用uboot 2021.01作为参考,cpu使用的risc-v架构,未来risc-v将变成一个不逊于arm的cpu框架。学习嵌入式linux,uboot也是一个绕不过去的知识点,这里抛砖引玉,做一下简要介绍,也算是自己的学习笔记。
U-boot和SPL
U-Boot 分为 uboot-spl 和 uboot 两个组成部分。SPL 是 Secondary Program Loader 的简称,第二阶段程序加载器。 对于嵌入式SOC(System On Chip)芯片来说,芯片内本身含有SRAM用于将闪存中的bootloader(uboot)加载到RAM来运行, 但由于片内RAM大小限制,加载不了完整的U-boot程序,所以需要在加载uboot之前加载一个精简版的SPL,SPL可用来初始化DDR等一些必须的外设,然后在把完整的Uboot加载到DDR里面运行。
概述启动流程
riscv目前uboot的启动代码位于arch/riscv/cpu/start.S内,链接脚本位于arch/riscv/cpu/u-boot.lds,可以查看源码发现程序从_start开始执行, 针对smp系统boot核心执行早期的初始化流程,大致流程为 board_init_f –> relocate_code –> board_init_r。 board_init_f定义在common/board_f.c,执行init_sequence_f数组中的函数,主要是初始化一些环境变量,对gd里面的变量赋值, board_init_r定义在common/board_r.c,执行init_sequence_f数组中的函数,主要是初始化一些驱动框架,初始化具体的硬件,到这里硬件都可以工作了,最后进入到run_main_loop –> main_loop,main_loop位于common/main.c。主要进行autoboot_command,cli_loop。 autoboot_command:倒计时结束后,获取默认的bootcmd,并执行boot。 cli_loop:倒计时被打断后,进入这里的控制台,用来接收输入的命令,并处理命令。
接下来的几篇文章会根据代码做一个详细的分析:
U-boot 启动流程分析 2 https://blog.csdn.net/Runner_Linux/article/details/129547048
U-boot 启动流程分析 3 https://blog.csdn.net/Runner_Linux/article/details/129552707
U-boot 启动流程分析 4 https://blog.csdn.net/Runner_Linux/article/details/129553081
U-boot 启动流程分析 5 https://blog.csdn.net/Runner_Linux/article/details/129553467