ARMv8架构u-boot启动流程详细分析(二)

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


注:本文基于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 */
	
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值