文章目录
注:本文基于armv8架构来对u-boot进行启动流程分析,u-boot版本为2022-01。
1 u-boot在汇编启动阶段对系统的一些初始化
当cpu交由u-boot接管进入u-boot后,首先会到_start符号处开始执行初始化,并在此期间完成一些必要的系统寄存器相关的初始化,包括保存boot参数,进行地址无关fixed,系统寄存器复位,底层平台相关初始化等,启动代码位于arch/arm/cpu/armv8/start.S,入口地址为_start。
1.1 启动前为后续流程做的一些平台相关操作
从_start开始,u-boot会根据board定义做一些平台化相关的初始化工作或者是保存一些重要寄存器信息,代码如下:
/*************************************************************************
*
* Startup Code (reset vector)
*
*************************************************************************/
.globl _start
_start: ------------------------------------------------------------------------ (1)
#if defined(CONFIG_LINUX_KERNEL_IMAGE_HEADER) ---------------------------------- (2)
#include <asm/boot0-linux-kernel-header.h>
#elif defined(CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK) -------------------------------- (3)
/*
* Various SoCs need something special and SoC-specific up front in
* order to boot, allow them to set that in their boot0.h file and then
* use it here.
*/
#include <asm/arch/boot0.h>
#else
b reset ----------------------------------------------------------------- (4)
#endif
.align 3
.globl _TEXT_BASE ------------------------------------------------------------ (5)
_TEXT_BASE:
.quad CONFIG_SYS_TEXT_BASE
/*
* These are defined in the linker script.
*/
.globl _end_ofs -------------------------------------------------------------- (5)
_end_ofs:
.quad _end - _start
.globl _bss_start_ofs
_bss_start_ofs:
.quad __bss_start - _start
.globl _bss_end_ofs
_bss_end_ofs:
.quad __bss_end - _start
reset:
/* Allow the board to save important registers */
b save_boot_params ----------------------------------------------------- (6)
.globl save_boot_params_ret
save_boot_params_ret:
... /* 此处省略无关代码,待分析到时再展开代码 */
...
WEAK(save_boot_params)
b save_boot_params_ret /* back to my caller */
ENDPROC(save_boot_params)
#endif
(1)_start段标记为全局可见并在链接脚本中被声明为入口地址,表示u-boot的入口地址为_start;
(2)首先进入入口后有两种可配置情况,一种就是定义了LINUX_KERNEL_IMAGE_HEADER,
boot0-linux-kernel-header.h展开部分后如下:
.macro le64sym, sym
.long \sym\()_lo32
.long \sym\()_hi32
.endm
.globl _start
_start:
/*
* DO NOT MODIFY. Image header expected by Linux boot-loaders.
*/
b reset /* branch to kernel start, magic */
.long 0 /* reserved */
le64sym _kernel_offset_le /* Image load offset from start of RAM, little-endian */
le64sym _kernel_size_le /* Effective size of kernel image, little-endian */
le64sym _kernel_flags_le /* Informative flags, little-endian */
.quad 0 /* reserved */
.quad 0 /* reserved */
.quad 0 /* reserved */
.ascii "ARM\x64" /* Magic number */

本文详细分析了基于ARMv8架构的u-boot启动流程,从_start入口开始,包括平台相关初始化、地址无关性修复、系统寄存器设置、从核引导等关键步骤。在汇编阶段,u-boot会根据配置进行Linux内核头部处理、平台特定初始化、地址重定位修复,以及异常向量表设置。此外,文章还介绍了多核启动时的系统控制寄存器配置、GIC初始化和从核进入u-boot的流程。通过对这些步骤的深入理解,有助于掌握ARMv8系统的启动机制。
最低0.47元/天 解锁文章
746

被折叠的 条评论
为什么被折叠?



