https://blog.csdn.net/forever_2015/article/details/53000643
1、bootloader到kernel启动总逻辑流程图
ARM架构中,EL0/EL1是必须实现,EL2/EL3是选配,ELx跟层级对应关系:
EL0 -- app
EL1 -- Linux kernel 、lk
EL2 -- hypervisor(虚拟化)
EL3 -- ARM trust firmware 、pre-loader
若平台未实现EL3(atf),pre-loader直接加载lk:
若平台实现EL3,则需要先加载完ATF再由ATF去加载lk:
bootloader 启动分两个阶段,一个是pre-loader加载lk(u-boot)阶段,另一个是lk加载kernel阶段。下面跟着流程图简述第一个阶段的加载流程。
1-3:设备上电起来后,跳转到Boot ROM(不是flash)中的boot code中执行把pre-loader加载起到ISRAM, 因为当前DRAM(RAM分SRAM跟DRAM,简单来说SRAM就是cache,DRAM就是普通内存)还没有准备好,所以要先把pre-loader load到芯片内部的ISRAM(Internal SRAM)中。
4-6:pre-loader初始化好DRAM后就将lk从flash(nand/emmc)中加载到DRAM中运行;
7-8:解压bootimage成ramdisk跟kernel并载入DRAM中,初始化dtb;
9-11:lk跳转到kernl初始化, kernel初始化完成后fork出init进程, 然后拉起ramdisk中的init程序,进入用户空间初始化,init进程fork出zygote进程..直到整个Android启动完成.
2、从pre-loader到lk(mt6580为例)
Pre-loader主要干的事情就是初始化某些硬件,比如: UART,GPIO,DRAM,TIMER,RTC,PMIC 等等,建立起最基本的运行环境,最重要的就是初始化DRAM.
时序图:
源码流程如下:
./bootloader/preloader/platform/mt6580/src/init/init.s
.section .text.start
...
.globl _start
...
/* set the cpu to SVC32 mode */
MRS r0,cpsr
BIC r0,r0,#0x1f
ORR r0,r0,#0xd3
MSR cpsr,r0
/* disable interrupt */
MRS r0, cpsr
MOV r1, #INT_BIT
ORR r0, r0, r1
MSR cpsr_cxsf, r0
...
setup_stk :
/* setup stack */
LDR r0, stack
LDR r1, stacksz
...
entry :
LDR r0, =bldr_args_addr