高通8996启动流程-4. lk启动流程

本文档分析MSM8996平台的启动流程,重点介绍lk启动过程中的关键节点,包括platform_early_init、dpc_init、timer_init等步骤,并详细解释了非fastboot启动与fastboot启动的区别。

1.前言

本文档主要对MSM8996的启动流程进行一个简要的分析,目的在于展现启动流程的概貌,不会对每个细节做很详细的表述,但会对启动流程的关键节点进行重点说明。本文主要lk的流程。

前面说过,boot_config_process_bl会循环执行各个协处理器的的回调,只有QSEE实现了jump_func函数,因此最终会跳转到qsee_jump_func执行,qsee内部执行的代码是不开源的,但是最终它会跳转到lk继续执行

2. 总体流程

在这里插入图片描述

lk主要完成早期的初始化,并引导内核

2.1 platform_early_init

在这里插入图片描述

初始化平台相关硬件设备,包括主板、时钟、中断控制器,scm等,为lk的启动和运行提供硬件环境

2.2 dpc_init

在这里插入图片描述

2.3 timer_init

在这里插入图片描述

2.4 bootstrap2

在这里插入图片描述

bootstrap2第二阶段执行进一步的初始化:

  1. arch_init:体系结构相关的初始化
  2. platform_init:平台初始化
  3. target_init:
  4. apps_init: aboot 是 lk 的中的一个 app, 这里才可以算是真正的 android bootloader,负责加载,校验,解密 boot.img ,后续 kernel 的启动都是在这里完成。

3. apps_init

在这里插入图片描述

通过代码可以看到位于apps_init函数包含两个for循环,每个for循环都执行位于__apps_start和__apps_end之间的结构体的回调函数。__apps_start和__apps_end是链接脚本中定义的两个变量,__apps_start和__apps_end区间内存放的是名为app的SECTION。

Lk中有两个宏:APP_START和APP_END,展开如下:

#define APP_START(appname) struct app_descriptor _app_##appname __SECTION(".apps") = { .name = #appname,
#define APP_END };

可以看到实际是定义一个结构体并声称其位于apps section。这其中就定义了_app_aboot结构体如下:

APP_START(aboot)
         .init = aboot_init,
APP_END

如上第一个for循环就会执行aboot_init函数,它主要做了如下的工作:

  1. 获取分页大小,并保存到全局变量 page_size 和 page_mask 中
  2. read_device_info(&device) 从 aboot 分区或 deviceinfo 分区获取 device的信息
  3. target_serialno((unsigned char *) sn_buf) 获取序列号并保存在全局变量 sn_buf 中,序列号就存储在 targe_sdc_init 中初始化的 dev 变量中
    这个序列号就是显示在Android系统设置中的吗?
  4. if (keys_get_state(KEY_VOLUMEUP) && keys_get_state(KEY_GREE)) 根据不同的按键状态和配置选择不同的启动模式,比如正常系统启动,recovery 启动等非fastboot模式启动

3.1 非fastboot启动

在这里插入图片描述

3.2 fastboot启动

在这里插入图片描述

4. 总结

  1. 初始化平台相关硬件设备,包括主板、时钟、中断控制器,scm等,为lk的启动和运行提供硬件环境
  2. 分为fastboot模式和非fastboot模式:
    • 非fastboot模式
      (1)从boot/recovery分区读取镜像到image_addr地址
      (2)解压缩kernel镜像
      (3)将解压后的kernel镜像和ramdisk镜像拷贝到image header所指定的位置(重定位)
      (4)更新 device tree,更新memory节点,增加起始地址和大小
      (5)通过boot_linux启动内核
    • fastboot模式
      fastboot 线程启动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值