高通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.pswp.cn/diannao/39192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39192.shtml
英文地址,請注明出處:http://en.pswp.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 也最多為…