MTK安卓启动流程
注:ARMv8架构中的EL0、EL1、EL2、EL3层级对应关系
EL0 – app
EL1 – kernel、lk
EL2 – 虚拟化一般不用
EL3 – ARM trust firmware、preloader
启动流程
-
- boot rom
- preloader
- little kernel
- kernel
-
- 上电先启动boot rom —->复位SOC、初始化内部RAM、初始化和发现外设、加载preloader到内部RAM,跳转到preloader
- boot rom 加载preloader —-> SOC内部SDRAM;设置C环境、设置时钟UART等、安全(只加载MTK授权的二进制文件)
- preloader开始,初始化外部RAM,加载LK到外部RAM
- LK开始执行,加载bootimage到外部RAM
Preloader处理流程
-
- pre process,初始化硬件
- handshake,握手校验,usb、uart、other mode
- load image,加载镜像LK,0x81e00000
Little Kernel 流程
-
crt0.s 初始化向量表,切换管理模式,跳转到Kmian
kmain,
thread init early,早期线程初始化,
arch init early,架构初始化(MMU、DRAM)
platfrom init early,平台早期初始化(wdt、iic、uart、led、gpio)
heap init,初始化内核heap、timer
bootstrap2,创建的系统初始化线程(平台初始化(logo等)、app初始化、启动模式)
-
bootstrap2详解
platform init,flash初始化、显示初始化、启动模式检测(recovery、fastboot)、加载logo、电量检测
app init
mt boot init,获取设备串号,sn号,进入boot linux form storage
- boot linux form storage,根据g boot mode选择启动模式,重定位根文件系统,设置内核启动参数通过boot linux(关闭MMU,IRQ、I\D-cache)拉起内核
-
Linux Kernel
-
- 关闭MMU、D-Cache,I-Cache 开关都可以,关闭FIQ、IRQ 、运行在SVC(超级用户模式),R1 –> 机器码,R2 –> 指针
- lookup_processor、machine检查处理器和机器码
- 检查ATag
- 创建页表,并使能MMU
- 开始内核