在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
--->cpu/s5pc11x/start.s (在cpu级)
(1)以下是异常向量表入口,默认情况下没有用,因为没有异常处理函数
(2)接着关闭快中断和普通中断,及设置管理模式(级别比较高),有linux系统时,才是用户模式usr
(3)cpu_init_crit,对A8核进行初始化
第一步:先关闭icache,然后初始化icache,最后再打开icache
重新初始化cache,因为bl0代码不是我们写的,把控不了代码,所以重新初始化。
第二步:设置cache时钟
第三步:关闭MMU,故第一阶段用的是物理地址
(4)读取“启动方式”信息,并保存启动方式
第一步:
PRO_ID_BASE 0xE0000000
OMR_OFFSET 0x04
先从0xE0000004这个寄存器中读出内容,先放在r1那里,然后将第0位和第5位清零,【4:1】位内容不变,最后将r1内容放入r2。(nandflash启动)六个引脚,第0位没有什么意义
第二步:
根据r2内容,初始化r3,后面的内容根据r3判断
第三步:
将r3内容拿到INF_REG寄存器,r3就可以其他通途了,因为r3是通用寄存器。
(5)在iram中新开辟一段栈。
准备要跳到另一段代码去(lowlevel_init)
(6)pc跳到另一个文件中,lowlevel_init(板级)
lowlevel_init在board/samsung/smdkc110/lowlevel_init当中
重新对硬件进行初始化,包括串口,ddr,关闭看门狗
(此处不论述)
(7)lowlevel_init执行完返回
将INF_REG(判断启动方式)内容取出比较,看看是从哪种方式启动。
(8)将整个uboot拷贝到内存
然后返回,共拷贝600000字节,拷到内存的0x23e00000(物理地址)
(9)打开MMU
将整个u-boot拷贝到ddr后,然后打开MMU,0x23e00000(物理地址) 映射成0xc3e00000(虚拟地址),下面的内容是在虚拟地址上操作。
(10)设置内存的堆和栈
在ddr中开辟堆和栈空间,给BL2的执行做好准备。
(11)清除bss段
在第二阶段(BL2)会开辟一些未初始化的全局变量区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。
(12)第二阶段的总入口
start_armboot是第二阶段c语言总的入口,这时候要进入第二阶段(BL2)了。