uboot启动之BL1阶段的分析1

本文详细分析了UBoot启动过程中的BL1阶段,主要包括CPU初始化、DRAM设置、从SD卡加载BL2、栈的三次设置、MMU虚拟地址映射等关键步骤,最终跳转至BL2阶段继续启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对uboot启动的BL1阶段的主体代码分析1 

BL1阶段代码的分析以start.s文件作为主要的目标,此篇博文主要对整个个流程进行分析。

总体分析:

BL1阶段的代码固化在IROM中的BL0调用执行,在上电之后会会执行,他的主要主要工作就是初始化soc,为uboot的主体代码也就是BL2阶段做好一切准备。  

BL1中重要的几个功能:

(1)CPU相关的一些基础的初始化;
 (2)初始化DRAM;
 (3)从sd卡中拷贝BL2(其实是拷贝整个uboot)到DRAM中;
 (4)设置三次不同用处的栈;
 (5)初始化MMU,虚拟地址映射的建立;
 (6)最后通过长跳转执行BL2阶段的代码。

 

下面是对start.S文件的具体分析:

1.镜像文件的16字节校验头:

#if defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)
	.word 0x2000
	.word 0x0
	.word 0x0
	.word 0x0
#endif

在裸机开发时,mkv210image.c完成了这个功能,进行镜像前16字节的填充占位。在之后被填充为坏牛肉:deadbeef

        .balignl 16,0xdeadbeef

 

2.构建异常向量表:

.globl _start
	_start: b	reset
		ldr	pc, _undefined_instruction
		ldr	pc, _software_interrupt
		ldr	pc, _prefetch_abort
		ldr	pc, _data_abort
		ldr	pc, _not_used
		ldr	pc, _irq
		ldr	pc, _fiq

cpu有异常事件发生时会在此向量表内进行查找,然后执行对应的函数,而这些函数具体的实现是参照硬件来实现。 在uboot中的异常向量表较少,因为他的主要工作是驱动硬件,而对于各种异常的处理不是主要的目标。

 

3.链接地址的指定:

_TEXT_BASE:
	.word	TEXT_BASE

这里的TEXT_BASE  就是我们配置阶段分析的 make 时传入的变量。

注:对于这里的汇编的语法做简单的说明:类似于定义了一个名为_TEXT_BASE的指针,而这个指针指向的是一个四字节的名为 TEXT_BASE 的变量

 

4.指定了uboot代码的运行地址:

TEXT_PHY_BASE:
	.word	CFG_PHY_UBOOT_BASE
#define CFG_PHY_UBOOT_BASE	MEMORY_BASE_ADDRESS + 0x3e00000

指定一个uboot进行运行的物理地址,而这个物理地址经过分析为:0x33e0000。 这个地址也是_TEXT_BASE指定的0xc3e00000链接地址所实际对应的物理地址,在之后的MMU初始化之后会将两个地址进行映射。

 

5.定义了一些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值