高通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.rhkb.cn/news/366521.html

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

相关文章

grpc学习golang版( 二、入门示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、环境二、编写protobuf文件三、编写server服务端四、编写Clie…

Rust单元测试、集成测试

单元测试、集成测试 在了解了如何在 Rust 中写测试用例后,本章节我们将学习如何实现单元测试、集成测试,其实它们用到的技术还是上一章节中的测试技术,只不过对如何组织测试代码提出了新的要求。 单元测试 单元测试目标是测试某一个代码单…

A4-C四驱高防轮式巡检机器人

在当今数字化和智能化迅速发展的时代,旗晟智能带来了一款革命性的创新产品——A4-C四驱高防轮式巡检机器人。这款机器人以其卓越的性能和多功能性,为工业巡检领域带来了全新的解决方案。 一、产品亮点 1、四驱动力与高防护设计 四驱高防轮式巡检机器人…

环回接口处理 IP 数据报的过程及 Loopback 接口的主要作用

环回接口处理 IP 数据报的过程 IPv4 中 传给环回地址(127.0.0.1)的任何数据均作为 IP 输入,直接送到环回接口(环回:IP 输入队列)。 传给广播地址或多播地址的数据报,会复制一份传给环回接口&…

主从同步binlog

主从同步的原理是怎样的 提到主从同步的原理,我们就需要了解在数据库中的一个重要日志文件,那就是 Binlog 二 进制日志,它记录了对数据库进行更新的事件。实际上主从同步的原理就是基于 Binlog 进 行数据同步的。在主从复制过程中&#xff…

FastGPT 调用Qwen 测试Hello world

Ubuntu 安装Qwen/FastGPT_fastgpt message: core.chat.chat api is error or u-CSDN博客 参考上面文档 安装FastGPT后 登录, 点击右上角的 新建 点击 这里,配置AI使用本地 ollama跑的qwen模型 问题:树上有3只鸟,开了一枪&#…

外贸企业选择什么网络?

随着全球化的深入发展,越来越多的国内企业将市场拓展到海外。为了确保外贸业务的顺利进行,企业需要建立一个稳定、安全且高速的网络。那么,外贸企业应该选择哪种网络呢?本文将为您详细介绍。 外贸企业应选择什么网络? …

pytest-yaml-sanmu(五):跳过执行和预期失败

除了手动注册标记之外,pytest 还内置了一些标记可直接使用,每种内置标记都会用例带来不同的特殊效果,本文先介绍 3 种。 1. skip skip 标记通常用于忽略暂时无法执行,或不需要执行的用例。 pytest 在执行用例时,如果…

Redis 7.x 系列【14】数据类型之流(Stream)

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 XADD2.2 XRANGE2.3 XREVRANGE2.4 XDEL2.5 XLEN2.6 XREAD2.7 XG…

【.Net】Web项目部署腾讯云

文章目录 总述前置准备docker-compose部署普通部署 参考 总述 前置准备 云服务添加端口 另有linux本身防火墙请参考: 【Linux】防火墙命令 需安装.Net SDK和Asp .Net Runtime 注意: 1、sdk也要不只是runtime 2、是Asp .Net Runtime不是.Net Runtime …

国产音频放大器工作原理以及应用领域

音频放大器是在产生声音的输出元件上重建输入的音频信号的设备,其重建的信号音量和功率级都要理想:如实、有效且失真低。音频范围为约20Hz~20000Hz,因此放大器在此范围内必须有良好的频率响应(驱动频带受限的扬声器时要…

BIOS设置与系统分区

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 目录 一BIOS 1破解密码的前提 2B…

Spring Cloud Gateway3.x自定义Spring Cloud Loadbalancer负载均衡策略以及实现动态负载均衡策略的方案

目录 前言 1.原理分析 1.1 ReactiveLoadBalancerClientFilter源码分析 1.2 LoadBalancerClientFactory源码分析 2.代码实现 2.1 扩展原生RoundRobinLoadBalancer轮询策略 2.1.1 自定义实现RoundRobinLoadBalancer 2.1.2 配置自定义的RoundRobinLoadBalan…

【web3】分享一个web入门学习平台-HackQuest

前言 一直想进入web3行业,但是没有什么途径,偶然在电鸭平台看到HackQuest的共学营,发现真的不错,并且还接触到了黑客松这种形式。 链接地址:HackQuest 平台功能 学习路径:平台有完整的学习路径&#xff…

金蝶云星空字段之间连续触发值更新

文章目录 金蝶云星空字段之间连续触发值更新场景说明具体需求:解决方案 金蝶云星空字段之间连续触发值更新 场景说明 字段A配置了字段B的计算公式,字段B配置了自动C的计算公式,修改A的时候,触发了B的重算,但是C触发不…

ABeam×StartUp | ABeam德硕中国新创部门拜访通用机器人初创公司 :逐际动力,就具身智能机器人的发展展开交流

近日,ABeam中国新创部门有幸拜访了深圳逐际动力科技有限公司(以下简称:逐际动力)。作为一家通用机器人公司,其在人形机器人、四轮足机器人等领域具有深厚的学术与技术储备。 现场合影 左:ABeam中国新创部门…

最快33天录用!一投就中的医学4区SCI,几乎不退稿~

【SciencePub学术】今天小编给大家推荐2本生物医学领域的SCI,此期刊为我处目前合作的重点期刊!影响因子0-3.0之间,最重要的是审稿周期较短,对急投的学者较为友好! 医学医药类SCI 01 / 期刊概况 【期刊简介】IF&…

多模态融合 + 慢病精准预测

多模态融合 慢病精准预测 慢病预测算法拆解子解法1:多模态数据集成子解法2:实时数据处理与更新子解法3:采用大型语言多模态模型(LLMMs)进行深度学习分析 慢病预测更多模态 论文:https://arxiv.org/pdf/2406…

高通骁龙(Qualcomm Snapdragon)CDSP HVX HTP 芯片简介与开发入门

1. Hexagon DSP/HVX/HTP 硬件演进 说到高通骁龙芯片大家应该不会陌生,其作为最为广泛的移动处理器之一,几乎每一个品牌的智能手机都会使用高通骁龙的处理器。 高通提供了一系列骁龙芯片解决方案。根据性能强弱分为了5个产品系列:从最高端的…

数据结构_1.0

一、数据结构概述 1.1 概念 在计算机科学中,数据结构是一种数据组织、管理和存储的格式 。它是相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技…