高通Android12启动流程分析

参考链接

https://blog.csdn.net/kill150/article/details/129929641
https://blog.csdn.net/Harrison509/article/details/108659469
https://www.cnblogs.com/pngcui/p/4665106.html

系统启动流程概览

高通Android设备的启动流程通常遵循以下步骤:

  1. PBL (Primary Boot Loader)

    • 设备上电后,首先执行的是PBL,它固化在ROM中。
    • PBL负责初始化DDR,加载SBL1(Secondary Boot Loader)。
  2. SBL1

    • SBL1继续硬件初始化,包括CPU、内存控制器等。
    • 加载并初始化TrustZone、QSEE(Qualcomm Secure Execution Environment)等安全组件。
  3. TrustZone/QSEE

    • TrustZone是ARM技术,用于提供系统级的安全解决方案。
    • QSEE是高通的安全执行环境,负责执行安全敏感的代码。
  4. Bootloader

    • 在SBL1之后,设备加载Bootloader。
    • Bootloader负责加载并验证内核(Linux Kernel)。
  5. 内核启动

    • 内核自解压并初始化硬件平台。
    • 设置内存管理单元(MMU),加载必要的驱动程序。
  6. init进程

    • init是Linux系统中的第一个用户空间进程。
    • 它负责挂载根文件系统,启动系统服务和守护进程。
  7. Zygote进程

    • 在Android系统中,Zygote是所有应用程序的父进程。
    • 它启动并为Android框架和应用程序提供服务。
  8. SystemServer

    • SystemServer是Android系统的核心服务进程。
    • 它启动包括窗口管理器、活动管理器、电源管理器等关键服务。
  9. UEFI启动(如果设备支持UEFI):

    • UEFI(统一可扩展固件接口)提供了一种新的启动方法。
    • 它包括SEC(安全环境配置)、PEI(EFI前期初始化)、DXE(驱动执行环境)、BDS(启动设备选择)等阶段。
  10. 显示子系统启动

    • 在显示设备准备好之后,启动显示管理器和相关的显示服务。
  11. 用户界面

    • 最后,启动Home Launcher,用户界面完全加载,设备准备就绪供用户使用。

请注意,这个流程可能会根据不同的硬件平台、Android版本和制造商的定制有所变化。上述步骤提供了一个高通Android设备从上电到操作系统完全启动的一般概述。

源码分析

1、启动文件 sbl1_Aarch64.s(对应架构的.s)

fibo/bp_code/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/Library/XBLLoaderLib/sbl1_Aarch64.s

sbl1_entry_init_stack:  // -------------------------------// add more assembly init code here for entering sbl1_main_ctl// // restore PBL parameter and enter sbl1_main_ctl// -------------------------------MOV w0, w7BL sbl1_main_ctl// For safetyBL boot_loop_here  // never returns

2、sbl1_main_ctl :restore PBL parameter and enter sbl1_main_ctl

fibo/bp_code/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/Library/XBLLoaderLib/sbl1_mc.c

/*!
* 
* @brief
*   The  Main Controller performs the following functions:
*       - Initializes ram
*       - And so on...
* 
* @param[in] pbl_shared Pointer to shared data
*  
* @par Dependencies
*   None
* 
* @retval
*   None
* 
* @par Side Effects
*   This function never returns.
* 
*/
void sbl1_main_ctl(boot_pbl_shared_data_type *pbl_shared)
{DALResult bsy_wait_init;/* Configure Domain access control register */mmu_set_dacr(DACR_ALL_DOMAIN_CLIENTS);/* Retrieve info passed from PBL*/sbl1_retrieve_shared_info_from_pbl(pbl_shared);/* Initialize shared functions structure - provides other images with function pointers in Loader */boot_shared_functions_register();/* Initialize SBL memory map */sbl1_populate_initial_mem_map(&bl_shared_data); /* Calculate the SBL start time for use during boot logger initialization. */sbl_start_time = CALCULATE_TIMESTAMP(HWIO_IN(TIMETICK_QTIMER_CLK));sbl_start_time_mpm = CALCULATE_MPM_TIMESTAMP(HWIO_IN(TIMETICK_CLK));/* Initialize busywait module Note: required before logger init due to uart driver dependency on busywait */BL_VERIFY((bsy_wait_init=boot_busywait_init()) == DAL_SUCCESS, (uint16)bsy_wait_init|BL_ERROR_GROUP_BUSYWAIT);/* Enable qdss workaround*/BL_VERIFY(boot_clock_debug_init() == TRUE, FALSE|BL_ERROR_GROUP_CLK );/* Enter debug mode if debug cookie is set */sbl1_debug_mode_enter();/* Initialize the stack protection canary */boot_init_stack_chk_canary();/* Initialize boot shared imem */boot_shared_imem_init(&bl_shared_data);/* Initialize the ChipInfo driver */ChipInfo_Init();/* Initialize the QSEE interface */sbl1_init_sbl_qsee_interface(&bl_shared_data, &sbl_verified_info);/* Initialize dal heap using internal memory */boot_DALSYS_HeapInit(boot_internal_heap, BOOT_INTERNAL_HEAP_SIZE, FALSE);/*Initialize DAL, needs to be called before modules that uses DAL */  boot_DALSYS_InitMod(NULL); /* Initialize boot logger and start the log timer.This must be done after sbl1_retrieve_shared_info_from_pbland boot_secboot_ftbl_init. */sbl1_boot_logger_init(&boot_log_data, pbl_shared); boot_log_set_meta_info(boot_log_data.meta_info_start);/* Set hash algorithm */BL_VERIFY(boot_set_hash_algo(SBL_HASH_SHA256) == BL_ERR_NONE, BL_ERR_UNSUPPORTED_HASH_ALGO|BL_ERROR_GROUP_BOOT);/* Call sbl1_hw_init to config pmic device so we can use PS_HOLD to reset */sbl1_hw_init();#if defined (FEATURE_DEVICEPROGRAMMER_IMAGE) || defined (FEATURE_DDI_IMAGE)/* Enter device programmer does not return */device_programmer_init(&bl_shared_data, pbl_shared);
#else/* Store the sbl1 hash to shared imem */boot_store_tpm_hash_block(&bl_shared_data, &sbl_verified_info);/*-----------------------------------------------------------------------Process the target-dependent SBL1 procedures-----------------------------------------------------------------------*/boot_config_process_bl(&bl_shared_data, SBL1_IMG, sbl1_config_table);
#endif} /* sbl1_main_ctl() */

3、boot_config.c

sbl1_config_table 执行的回调函数table

fibo/bp_code/BOOT.XF.4.1/boot_images/QcomPkg/SocPkg/Library/XBLLoaderLib/sbl1_config.c

/*==========================================================================DEFINE TARGET BOOT CONFIG TABLE
===========================================================================*/
boot_configuration_table_entry sbl1_config_table[] = 
{
/* host_img_id host_img_type target_img_id target_img_type target_img_sec_type        load   auth   exec   jump   exec_func jump_func   pre_procs       post_procs         load_cancel              target_img_partition_id         target_img_str            boot_ssa_enabled enable_xpu xpu_proc_id sbl_qsee_interface_index seg_elf_entry_point whitelist_ptr */{SBL1_IMG, CONFIG_IMG_QC, GEN_IMG, CONFIG_IMG_ELF,     SECBOOT_APDP_SW_TYPE,        TRUE,  TRUE,  FALSE, FALSE, NULL, NULL,           apdp_pre_procs, apdp_post_procs,   apdp_load_cancel,        apdp_partition_id,              APDP_BOOT_LOG_STR,        FALSE, FALSE, 0x0, 0x0, 0x0,                    apdp_img_whitelist    },{SBL1_IMG, CONFIG_IMG_QC, GEN_IMG, CONFIG_IMG_ELF,     SECBOOT_OEM_MISC_SW_TYPE,    TRUE,  TRUE,  FALSE, FALSE, NULL, NULL,           NULL,           NULL,              oem_misc_load_cancel,    multi_image_partition_id,       OEM_MISC_BOOT_LOG_STR,    FALSE, FALSE, 0x0, 0x0, 0x0,                    oem_misc_img_whitelist},{SBL1_IMG, CONFIG_IMG_QC, GEN_IMG, CONFIG_IMG_ELF,     SECBOOT_QTI_MISC_SW_TYPE,    TRUE,  TRUE,  FALSE, FALSE, NULL, NULL,           NULL,           NULL,              qti_misc_load_cancel,    multi_image_qti_partition_id,   QTI_MISC_BOOT_LOG_STR,    FALSE, FALSE, 0x0, 0x0, 0x0,                    qti_misc_img_whitelist},{SBL1_IMG, CONFIG_IMG_QC, GEN_IMG, CONFIG_IMG_ELF,     SECBOOT_RPM_FW_SW_TYPE,      TRUE,  TRUE,  FALSE, FALSE, NULL, NULL,           rpm_pre_procs,  NULL,              rpm_load_cancel,         rpm_partition_id,               RPM_BOOT_LOG_STR,         FALSE, FALSE, 0x0, 0x0, 0x0,                    rpm_img_whitelist     },{SBL1_IMG, CONFIG_IMG_QC, GEN_IMG, CONFIG_IMG_ELF,     SECBOOT_QSEE_DEVCFG_SW_TYPE, TRUE,  TRUE,  FALSE, FALSE, NULL, NULL,           NULL,           NULL,              qsee_devcfg_load_cancel, qsee_devcfg_image_partition_id, QSEE_DEVCFG_BOOT_LOG_STR, FALSE, FALSE, 0x0, 0x0, 0x0,                    devcfg_img_whitelist  },{SBL1_IMG, CONFIG_IMG_QC, GEN_IMG, CONFIG_IMG_ELF,     SECBOOT_QSEE_SW_TYPE,        TRUE,  TRUE,  FALSE, FALSE, NULL, NULL,           NULL,           qsee_post_procs,   NULL,                    qsee_partition_id,              QSEE_BOOT_LOG_STR,        FALSE, FALSE, 0x0, 0x0, 0x0,                    qsee_img_whitelist    },{SBL1_IMG, CONFIG_IMG_QC, GEN_IMG, CONFIG_IMG_ELF,     SECBOOT_SEC_SW_TYPE,         TRUE,  TRUE,  FALSE, FALSE, NULL, NULL,           NULL,           NULL,              sec_load_cancel,         secdata_partition_id,           SEC_BOOT_LOG_STR,         FALSE, FALSE, 0x0, 0x0, 0x0,                    sec_img_whitelist     },{SBL1_IMG, CONFIG_IMG_QC, GEN_IMG, CONFIG_IMG_ELF,     SECBOOT_QHEE_SW_TYPE,        TRUE,  TRUE,  FALSE, FALSE, NULL, NULL,           NULL,           NULL,              NULL,                    qhee_partition_id,              QHEE_BOOT_LOG_STR,        FALSE, FALSE, 0x0, 0x0, 0x0,                    qhee_img_whitelist    },{SBL1_IMG, CONFIG_IMG_QC, GEN_IMG, CONFIG_IMG_ELF,     SECBOOT_WDT_SW_TYPE,         TRUE,  TRUE,  FALSE, TRUE,  NULL, sti_jump_func,  NULL,           NULL,              sti_load_cancel,         sti_partition_id,               STI_BOOT_LOG_STR,         FALSE, FALSE, 0x0, 0x0, 0x0,                    sti_img_whitelist     },{SBL1_IMG, CONFIG_IMG_QC, GEN_IMG, CONFIG_IMG_ELF,     SECBOOT_APPSBL_SW_TYPE,      TRUE,  TRUE,  FALSE, TRUE,  NULL, qsee_jump_func, NULL,           appsbl_post_procs, appsbl_load_cancel,      appsbl_partition_id,            APPSBL_BOOT_LOG_STR,      FALSE, FALSE, 0x0, 0x0, SCL_XBL_CORE_CODE_BASE, xbl_core_img_whitelist},{NONE_IMG, }
};

fibo/bp_code/BOOT.XF.4.1/boot_images/QcomPkg/XBLLoader/boot_config.c

boot_config_process_bl 处理每一个 sbl1_config_table 回调函数列表

/*!
* 
* @brief
*   Function to process and execute boot code based on information from the  
*   configuration table. This parses through the entire table and calls
*   boot_config_process_entry() on each entry corresponding to the host 
*   image in order. 
* 
* @param[in] bl_shared_data - Pointer to the shared data structure
* @param[in] host_img - Image ID of the host boot loader 
* @param[in] boot_config_table - Bootloader specific configuration table
*   
* @par Dependencies
*   None
*   
* @retval
*   None
* 
* @par Side Effects
*   None
*/
void boot_config_process_bl 
( bl_shared_data_type *bl_shared_data, image_type host_img, boot_configuration_table_entry * boot_config_table 
)
{boot_configuration_table_entry *curr_entry = NULL;BL_VERIFY( bl_shared_data != NULL && boot_config_table != NULL,BL_ERR_NULL_PTR_PASSED|BL_ERROR_GROUP_BOOT);/* For every entry in the boot configuration table */for(curr_entry = boot_config_table

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/39192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA】利用Redisson和Spring实现高效物联温度控制链路,确保温度调节的准确性和效率,定时链路执行使用案例,一环扣一环

主要功能和场景 柔性调温策略:这个类主要用于管理一个温度调节流程,通过不同的策略(如策略1和策略2)来调节温度,确保设备或环境中的温度达到预设的目标。 紧急停止机制:在流程执行过程中,如果需…

AI模型大宗师Transformer的Encoder魔法棒

在AI大模型数字王国里,有一位名叫Transformer的魔法大宗师。他有一个神奇的百宝箱,里面有很多魔法工具,其中有个工具叫Encoder,这个工具拥有一种神奇的力量,可以将复杂的输入信息进行编码,提取出关键的特征…

以 Vue 3 项目为例,你是否经常遇到 import 语句顺序混乱的问题?要想解决它其实很容易!

大家好,我是CodeQi! 在项目开发过程中,我们经常会遇到项目中的 import 语句顺序混乱的问题。 这不仅会影响代码的可读性,还可能使我们代码在提交的时候产生不必要的冲突。 面对这种情况,要想解决它其实很容易。 通过合理的规范和自动化工具,我们可以确保 import 语句…

计算机网络 —— 路由协议:RIP、OSPF、BGP、MPLS

路由协议 1. 定义2. IGP2.1 RIP2.2 OSPF 3. BGP4. MPLS 1. 定义 互联网中需要通过路由将数据发送至目标主机。 路由器根据路由控制表(RoutingTable)转发数据包,它根据所收到的数据包中目标主机的IP地址与路由控制表的比较得出下一个应该接收的路由器。 &#xff…

大学生放学后一定要做的4件事情

不知道有多少学生们,和我当年一样,上课不想去,找人帮着点名。放学后,去网吧,瞎玩,玩着玩着就毕业了,现在想想啊,真是不应该。所以,下面这4件事情,我建议你去做…

Linux/Unix命令

这篇是另一篇内容的前置知识。因为项目部署测试需要,向公司申请了一个虚拟机做服务器用。以下是回溯的命令,多了解了解,拓宽知识面吧。PS:本人unix/linux知识0,见啥都稀奇,小白一个,知识浅显&am…

CSharp——Encoding编码详情

CSharp-Encoding编码 在网络通信中,很多情况下都是将字符信息转成字节序列进行传输。将字符序列转为字节序列的过程称为编码。当这些字节传送到接收方,接收方需要逆向将字节序列转为字符序列。这个过程就是解码。 常见编码有ASCII字符集 ,非…

SQL | join 的目的是什么?

如是我闻: 在 SQL 中使用 JOIN 的目的是将两个或多个数据库表的数据组合在一起,这样我们就可以在一个查询中获取这些表的相关信息。 假设我们有两本不同的书,一本记录了孩子们的名字和他们的爱好,另一本记录了他们的家庭地址。如…

盛元广通打造智慧校园实验室安全管理系统

盛元广通智慧校园实验室安全管理系统以安全为重点,构建由学校、二级单位、实验室组成的三级联动的实验室安全多级管理体系、多类用户角色,内置教育部标准检查表,支撑实验室相关业务过程的智慧管理。实现通过PC端/手机移动端开展检查工作、手机…

sh脚本笔记2

test条件测试 语法 条件测试语法说明语法1&#xff1a;test <测试表达式>这是利用test命令进行条件测试表达式的方法。test命令和“<测试表达式>”之间至少有一个空格语法2&#xff1a;[ <测试表达式> ]这是通过[]&#xff08;单中括号&#xff09;进行条件…

将exe文件添加到注册表中,实现开机时自动运行

目录 一、前言 二、代码 三、使用步骤 1.编译生成exe文件、 2.以管理员身份运行代码 3.打开注册表&#xff0c;验证结果 一、前言 在Windows操作系统中&#xff0c;将exe文件的路径添加到注册表下&#xff0c;主要用于实现程序的开机自动运行功能。 注册表路径为&#xf…

白骑士的C语言教学基础篇 1.3 控制流

系列目录 上一篇&#xff1a;白骑士的C语言教学基础篇 1.2 C语言基础语法 在这一节中&#xff0c;我们将介绍C语言中的控制流结构&#xff0c;包括条件语句、循环语句以及循环控制语句。这些结构允许我们根据不同的条件执行不同的代码块&#xff0c;从而使程序更具灵活性和功能…

Python中的并发编程(5)PyQt 多线程

PyQt 多线程 1 卡住的计时器 我们定义了一个计时器&#xff0c;每秒钟更新一次显示的数字。此外我们定义了一个耗时5秒的任务oh_no&#xff0c;和按钮“危险”绑定。 当我们点击“危险”按钮时&#xff0c;程序去执行oh_no&#xff0c;导致显示停止更新了。 import sys im…

Aspose.PDF功能演示:在程序中合并 JPG 文件

Aspose.PDF 是一款高级PDF处理API&#xff0c;可以在跨平台应用程序中轻松生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现&#xff0c;保护和打印文档。无需使用Adobe Acrobat。此外&#xff0c;API提供压缩选项&#xff0c;表创建和处理&#xff0c;图形和图像功能&am…

Kile钟优化等级讲解

这里直接说说kile的优化等级: 这里有4个等级,分别为:-O0、-O1、-O2、-O3 为什么要进行编译优化? 主要目的: 1. 提高代码执行的速度; 2. 减少内存占用; 3. 降低能耗,延长电池寿命; 4. 消除代码中冗余和不必要的代码,提高程序稳定性和可靠性。 Kile等级描述: -O0:这…

leetcode-21-回溯-全排列及其去重

一、[46]全排列 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 其中&#xff0c;不需要使用startIndex used数组&#xff0c;其实就是记录此时path里都有哪些元素…

【图论】200. 岛屿问题

200. 岛屿问题 难度&#xff1a;中等 力扣地址&#xff1a;https://leetcode.cn/studyplan/top-100-liked/ 问题描述 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&…

一个专为Android平台设计的高度可定制的日历库

大家好&#xff0c;今天给大家分享一个高度可定制的日历库kizitonwose/Calendar。 Calendar专为Android平台设计&#xff0c;支持RecyclerView和Compose框架。它提供了丰富的功能&#xff0c;允许开发者根据需求定制日历的外观和功能。 项目介绍 此库是开发Android应用时&…

大型语言模型评估调查

原文链接&#xff1a;A Survey on Evaluation of Large Language Models | ACM Transactions on Intelligent Systems and Technology 本文从三个关键维度&#xff1a;评价什么、在哪里评价和如何评价&#xff0c;对这些 LLMs 评价方法进行了全面回顾。 首先&#xff0c;我们…

第十四届蓝桥杯省赛C++A组F题【买瓜】题解(AC)

70pts 题目要求我们在给定的瓜中选择一些瓜&#xff0c;可以选择将瓜劈成两半&#xff0c;使得最后的总重量恰好等于 m m m。我们的目标是求出至少需要劈多少个瓜。 首先&#xff0c;我们注意到每个瓜的重量最多为 1 0 9 10^9 109&#xff0c;而求和的重量 m m m 也最多为…