u-boot——start.S文件(属于第一阶段)分析

时间:2022-07-20 04:04:25
start.s (链接脚本u-boot.lds第一个链接的文件)

在cpu/s5pv11x/start.s 中,入口是_start

独立编址:如内核不能访问nandflash的地址,该地址为独立编址;内核能够访问的地址为统一编址,如ddr里面的地址为统一编址。

irom内容(BL0)只能读出来,不能写进去。

irom功能:关闭开门狗;打开icache;初始化iram的堆,栈;初始化系统时钟;判断启动方式引脚,即确定uboot代码在哪里拷贝进去iram,是nandflash,sd卡,还是nor Flash。


bl1(asm格式)是 24k或16k或8k,BL0里面的代码拷贝到iram的0xd0020000,入口是_start

cpu/s5pv11x/start.s的开始4个word可知BL1是8K,只拷贝8K内容到iram

u-boot——start.S文件(属于第一阶段)分析


第一阶段(ASM)BL1

--->cpu/s5pc11x/start.s (在cpu级)

(1)以下是异常向量表入口,默认情况下没有用,因为没有异常处理函数

u-boot——start.S文件(属于第一阶段)分析


(2)接着关闭快中断和普通中断,及设置管理模式(级别比较高),有linux系统时,才是用户模式usr

u-boot——start.S文件(属于第一阶段)分析


(3)cpu_init_crit,对A8核进行初始化

第一步:先关闭icache,然后初始化icache,最后再打开icache

重新初始化cache,因为bl0代码不是我们写的,把控不了代码,所以重新初始化。

u-boot——start.S文件(属于第一阶段)分析

第二步:设置cache时钟

u-boot——start.S文件(属于第一阶段)分析


第三步:关闭MMU,故第一阶段用的是物理地址

u-boot——start.S文件(属于第一阶段)分析


(4)读取“启动方式”信息,并保存启动方式

第一步:

u-boot——start.S文件(属于第一阶段)分析

PRO_ID_BASE         0xE0000000

OMR_OFFSET          0x04

先从0xE0000004这个寄存器中读出内容,先放在r1那里,然后将第0位和第5位清零,【4:1】位内容不变,最后将r1内容放入r2。(nandflash启动)六个引脚,第0位没有什么意义


第二步:

u-boot——start.S文件(属于第一阶段)分析

根据r2内容,初始化r3,后面的内容根据r3判断


第三步:

u-boot——start.S文件(属于第一阶段)分析

将r3内容拿到INF_REG寄存器,r3就可以其他通途了,因为r3是通用寄存器。


(5)在iram中新开辟一段栈

u-boot——start.S文件(属于第一阶段)分析

准备要跳到另一段代码去(lowlevel_init)


(6)pc跳到另一个文件中,lowlevel_init(板级)

lowlevel_init在board/samsung/smdkc110/lowlevel_init当中

重新对硬件进行初始化,包括串口,ddr,关闭看门狗

(此处不论述)


(7)lowlevel_init执行完返回

u-boot——start.S文件(属于第一阶段)分析

将INF_REG(判断启动方式)内容取出比较,看看是从哪种方式启动。


(8)将整个uboot拷贝到内存

u-boot——start.S文件(属于第一阶段)分析

然后返回,共拷贝600000字节,拷到内存的0x23e00000(物理地址)  


(9)打开MMU

u-boot——start.S文件(属于第一阶段)分析

将整个u-boot拷贝到ddr后,然后打开MMU,0x23e00000(物理地址) 映射成0xc3e00000(虚拟地址),下面的内容是在虚拟地址上操作。


(10)设置内存的堆和栈

u-boot——start.S文件(属于第一阶段)分析

在ddr中开辟堆和栈空间,给BL2的执行做好准备。


(11)清除bss段

u-boot——start.S文件(属于第一阶段)分析

在第二阶段(BL2)会开辟一些未初始化的全局变量区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。


(12)第二阶段的总入口

u-boot——start.S文件(属于第一阶段)分析

start_armboot是第二阶段c语言总的入口,这时候要进入第二阶段(BL2)了。