简介
uboot代码分为两部分 uboot-spl和uboot,uboot-spl为上一节所说的BL2。使用三星提供的工具,可以把uboot-spl.bin转化成BL2。
uboot-spl
通过编译uboot-2018我们可以产生uboot-spl镜像,由于BL1会负责把BL2拷贝到0x02023400处,所以需要定义uboot-spl的链接地址为0x02023400
#define CONFIG_SPL_TEXT_BASE 0x02023400
下面是spl部分的简要流程
1.vectors.S (arch/arm/lib)
.macro ARM_VECTORS //macro 用来定义一段宏,可以类比成c语言的内联函数
b reset
ldr pc, _undefined_instruction
....
.endm //结束宏
_start: //最开始执行的地方
ARM_VECTORS //跳到定义处,在定义处可以看出 是b reset
2.start.S (arch/arm/cpu/armv7)
reset:
b save_boot_params
/*
* 如果不是处于HYP模式,则失能FIQ和IRQ,设置cpu为SVC32模式
* ARM的主要工作模式
* 处理器工作模式 说明
* 用户模式(usr) ARM处理器正常的程序执行状态
* 系统模式(sys) 运行具有特权的操作系统任务
* 快中断模式(fiq) 支持高速数据传输或通道处理
* 管理模式(svc) 操作系统保护模式
* 数据访问终止模式(abt) 用于虚拟存储器及存储器保护
* 中断模式(irq) 用于通用的中断处理
* 用户模式和系统模式之外的5种模式称为异常模式
*/
mrs r0, cpsr // mrs:把程序状态寄寄存器的数据传输到通用寄存器中
and r1, r0, #0x1f @ mask mode bits
teq r1, #0x1a @ test for HYP mode
bicne r0, r0, #0x1f @ clear all mode // bits bic=bic+ne=if teq not equal,excute bic
orrne r0, r0, #0x13 @ set SVC mode
orr r0, r0, #0xc0 @ disable FIQ and IRQ
msr cpsr,r0 // msr:把通用寄存器的数据传输到程序状态寄存器中
bl cpu_init_cp15 ----->
----> ENTRY(cpu_init_cp15)
/*
* 失能 L1 I/D
* Cache
* 1) Cache 是位于 CPU与主存储器DRAM之间一个模块,为了解决cpu和内存之间的速度匹配问题
* Cache又分为I-cache(用来存指令)和D-cache(用来存数据)
* 为什么要让Cache失效?
* 2)我们在使用cache的时候要经过一系列的配置,在没配置之前是不能使用的。所以我们要关闭cache,但是在关闭
* cache之前cache里面可能已经有数据了,为了不影响我们 的代码,所以要先让其失效,在进行关闭
*/
mov r0, #0 @ set up for MCR
mcr p15, 0, r0, c8, c7, 0 &