91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深入解析RK平臺Android/Linux Bootloader核心文件:android_bootloader.c

jf_44130326 ? 來源:Linux1024 ? 作者:Linux1024 ? 2026-01-09 10:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Bootloader是Android設備啟動的第一道“關卡”,負責初始化硬件、加載系統(tǒng)鏡像并完成內核啟動的前置準備。在基于U-Boot的Android設備中,android_bootloader.c是對接Android啟動邏輯的核心文件——它決定了設備是進入正常系統(tǒng)、Recovery模式還是Fastboot模式,同時承擔了AVB(Android Verified Boot)驗證、內核加載、命令行參數組裝等關鍵工作。(這個啟動流程android和linux共用)

本文將從文件定位、核心函數、執(zhí)行流程三個維度,拆解這個文件的底層邏輯。

一、文件核心定位

android_bootloader.c是U-Boot中實現Android啟動流程的核心模塊,核心職責包括:

1.解析BCB(Bootloader Control Block)信息,決策設備啟動模式(正常/Recovery/Fastboot);

2.處理AVB驗證邏輯,保障系統(tǒng)鏡像的完整性;

3.加載Android內核/Recovery鏡像到指定內存地址;

4.組裝內核啟動參數(cmdline),傳遞系統(tǒng)啟動所需的關鍵信息;

5.處理DTBO(Device Tree Overlay)疊加,適配不同硬件配置;

6.對接Android A/B分區(qū)機制,支持槽位切換與驗證。

該文件依賴android_bootloader_message.h(BCB結構體定義)、android_avb(AVB驗證)、bootm.h(內核啟動)等核心頭文件,是Bootloader與Android系統(tǒng)之間的“橋梁”。

二、核心函數拆解

按功能模塊劃分,文件中的核心函數可分為6大類,以下是關鍵函數的細節(jié)解析:

1. BCB(啟動控制塊)操作模塊

BCB存儲在misc分區(qū),是Bootloader與Android系統(tǒng)交互啟動指令的核心載體,相關函數負責BCB的讀寫與解析。

(1)android_bootloader_message_load/write

?作用:從misc分區(qū)讀取/寫入BCB結構體(android_bootloader_message);

?關鍵邏輯

?計算BCB所需的扇區(qū)數,檢查misc分區(qū)大小是否足夠;

?調用blk_dread/blk_dwrite完成分區(qū)讀寫;

?讀寫失敗時打印錯誤日志,返回負值。

(2)android_bootloader_load_and_clear_mode

?作用:解析啟動模式,是整個文件的“決策中樞”;

?關鍵邏輯

a.先檢查RAM中是否有Fastboot指令(如reboot-bootloader),有則直接返回BOOTLOADER模式;

b.加載misc分區(qū)的BCB,解析command字段:

bootonce-bootloader:單次進入Bootloader,讀取后清空BCB;

boot-recovery/boot-fastboot:進入Recovery模式;

無匹配指令:默認NORMAL模式。

(3)android_bcb_write

?作用:向misc分區(qū)寫入啟動指令(如Recovery啟動命令);

?關鍵限制:指令長度不能超過32字節(jié),否則返回內存錯誤。

2. AVB驗證模塊

AVB是Android的鏡像驗證機制,保障系統(tǒng)鏡像未被篡改,相關函數處理驗證流程與鏡像分發(fā)。

(1)android_slot_verify

?作用:核心AVB驗證函數,完成分區(qū)驗證與狀態(tài)更新;

?關鍵邏輯

a.檢測設備解鎖狀態(tài)(解鎖則跳過嚴格驗證);

b.分配內存緩沖區(qū),加載boot/vendor_boot/init_boot等分區(qū);

c.調用avb_slot_verify執(zhí)行哈希樹驗證;

d.根據驗證結果更新androidboot.verifiedbootstate(green/orange/yellow/red);

e.驗證失敗時標記當前槽位為不可啟動。

(2)avb_image_distribute_prepare/finish

?作用:AVB驗證前后的鏡像內存管理;

?prepare:分配連續(xù)內存緩沖區(qū),規(guī)劃boot/vendor_boot/init_boot的內存布局;

?finish:將驗證后的鏡像分發(fā)到指定內存地址,修復v3+版本的boot.img頭部。

3.鏡像加載模塊

負責從指定分區(qū)加載Android鏡像到內存,是內核啟動的前置步驟。

(1)android_image_load_by_partname

?作用:根據分區(qū)名(如boot/recovery)加載鏡像到指定內存;

?關鍵邏輯

a.通過分區(qū)名獲取分區(qū)信息(起始扇區(qū)、大小);

b.調用android_image_load將鏡像加載到內存,并返回加載后的地址。

(2)android_bootloader_boot_flow

?作用:整合所有啟動流程的“主函數”;

?核心流程:啟動模式檢測→ AVB驗證→鏡像加載→命令行組裝→內核啟動。

4.內核啟動模塊

負責內核啟動的最終執(zhí)行,包括內存分配、參數傳遞。

android_bootloader_boot_kernel

?作用:啟動Android內核;

?關鍵邏輯

a.解析內核壓縮類型(GZIP/LZ4/LZO等),計算解壓所需內存;

b.分配解壓內存,釋放壓縮鏡像占用的內存;

c.組裝bootm參數(內核地址、設備樹地址);

d.調用do_bootm_states執(zhí)行內核啟動流程。

5.命令行組裝模塊

內核啟動參數(cmdline)的核心組裝邏輯,決定系統(tǒng)啟動的行為。

android_assemble_cmdline

?作用:整合多源參數,生成最終的內核cmdline;

?整合內容

a.環(huán)境變量中的bootargs基礎參數;

b.A/B分區(qū)的槽位后綴(如androidboot.slot_suffix=_a);

c.設備序列號(androidboot.serialno=xxx);

d.根設備信息(root=/dev/xxx);

e.啟動模式參數(如skip_initramfs/androidboot.force_normal_boot=1)。

6. DTBO疊加模塊

適配不同硬件配置的設備樹疊加邏輯。

android_fdt_overlay_apply

?作用:加載DTBO分區(qū),將設備樹疊加層應用到主設備樹;

?關鍵邏輯

a.根據啟動模式(正常/Recovery)選擇DTBO分區(qū);

b.讀取DTBO頭部,選擇匹配的設備樹條目;

c.擴容主設備樹內存,應用疊加層;

d.失敗時回滾主設備樹備份。

三、核心執(zhí)行流程(附流程圖)

android_bootloader.c的整體執(zhí)行流程可分為5個階段,以下是流程拆解與可視化流程圖:

1.流程總覽

wKgZPGlgbzKAOmv4AAJ4BrBWUqk590.png

2.流程分步解析

階段1:啟動模式檢測(核心是BCB解析)

Bootloader啟動后,首先讀取misc分區(qū)的BCB結構體,同時檢查RAM中是否有Fastboot遺留指令(如reboot-bootloader)。根據BCB的command字段,決策設備進入NORMAL(正常)、RECOVERY(恢復)或BOOTLOADER(Fastboot)模式。

階段2:AVB驗證(可選)

?若設備鎖定且啟用AVB,執(zhí)行分區(qū)驗證:分配連續(xù)內存緩沖區(qū),加載boot/vendor_boot/init_boot等分區(qū),通過AVB哈希樹驗證鏡像完整性;

?若設備解鎖,跳過嚴格驗證,僅標記驗證狀態(tài)為orange(未驗證);

?驗證完成后,將鏡像分發(fā)到內核啟動所需的內存地址。

階段3:鏡像加載

根據啟動模式選擇對應的分區(qū)(正常模式選boot,Recovery模式選recovery/boot),調用android_image_load將鏡像加載到指定內存地址。

階段4:命令行組裝

整合環(huán)境變量、A/B槽位、序列號、啟動模式參數等,生成最終的內核cmdline,并更新bootargs環(huán)境變量(如添加androidboot.slot_suffix=_a、skip_initramfs等)。

階段5:內核啟動

?適配DTBO疊加層(若有),擴容主設備樹并應用疊加;

?根據內核壓縮類型分配解壓內存,釋放壓縮鏡像內存;

?調用do_bootm_states執(zhí)行內核啟動流程,完成Bootloader到Android內核的交接。

四、核心亮點與設計思路

1.靈活性適配:支持A/B分區(qū)、AVB驗證、DTBO疊加等Android核心特性,兼容不同版本的Android啟動邏輯;

2.容錯機制:BCB讀取失敗時默認進入正常模式,AVB驗證失敗時標記槽位為不可啟動,保障設備基礎可用性;

3.內存高效管理:AVB驗證時分配連續(xù)內存緩沖區(qū),統(tǒng)一管理boot/vendor_boot/init_boot的內存布局,避免內存碎片;

4.啟動模式兼容:兼顧傳統(tǒng)Recovery分區(qū)與A/B分區(qū)的Recovery邏輯(無Recovery分區(qū)時復用boot分區(qū))。

五、總結

android_bootloader.c是U-Boot對接Android啟動邏輯的“核心樞紐”——它上承Bootloader的硬件初始化,下啟Android內核的啟動流程,同時兼顧了安全性(AVB)、靈活性(A/B分區(qū))和兼容性(DTBO)。

理解這個文件的邏輯,不僅能掌握Android/linux設備的啟動流程,更能為定制化Bootloader、排查啟動故障(如Recovery無法進入、AVB驗證失?。┨峁┖诵乃悸贰τ贏ndroid底層開發(fā)、設備調試人員來說,這個文件是必須深入理解的核心模塊。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    4023

    瀏覽量

    133957
  • u-boot
    +關注

    關注

    0

    文章

    135

    瀏覽量

    39738
  • bootloader
    +關注

    關注

    2

    文章

    244

    瀏覽量

    48015
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RK3576 Android15音頻開發(fā)必看:alsa_route核心文件解析與修改場景

    RK?Android平臺開發(fā)的同學,大概率都遇到過這些音頻問題:插耳機沒聲音、通話音量忽大忽小、新增的HDMI聲卡沒適配、錄音增益異?!?這些問題看似五花八門,根源卻大概率指向同一個核心
    的頭像 發(fā)表于 02-26 08:08 ?71次閱讀
    <b class='flag-5'>RK</b>3576 <b class='flag-5'>Android</b>15音頻開發(fā)必看:alsa_route<b class='flag-5'>核心</b><b class='flag-5'>文件</b><b class='flag-5'>解析</b>與修改場景

    深入解析U-Boot image.cRK平臺鏡像處理核心邏輯

    在瑞芯微(RK平臺的嵌入式開發(fā)中,U-Boot作為核心的啟動加載程序,負責完成鏡像解析、校驗、加載等關鍵流程。而image.c正是U-Bo
    的頭像 發(fā)表于 02-24 16:46 ?1403次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b>U-Boot image.<b class='flag-5'>c</b>:<b class='flag-5'>RK</b><b class='flag-5'>平臺</b>鏡像處理<b class='flag-5'>核心</b>邏輯

    RK平臺Android設備OTA升級教程:從原理到U盤實操

    OTA(Over-The-Air)升級是 Android 系統(tǒng)標準的軟件更新方式,在 RK(瑞芯微)平臺上,OTA 升級不僅支持本地升級(如 U 盤、SD 卡),還支持網絡升級,同時提供“完整包
    的頭像 發(fā)表于 02-09 16:23 ?708次閱讀
    <b class='flag-5'>RK</b><b class='flag-5'>平臺</b><b class='flag-5'>Android</b>設備OTA升級教程:從原理到U盤實操

    RK3576平臺Android HAL層故障排查:從lshal命令看透問題本質

    RK3576 作為瑞芯微主流的中高端芯片,其 HAL 層基于 HIDL ( Android 硬件接口定義語言)實現,排查這類問題的核心工具就是 lshal —— 一個能直接暴露 HIDL 服務運行狀態(tài)的命令
    的頭像 發(fā)表于 02-06 07:12 ?157次閱讀
    <b class='flag-5'>RK</b>3576<b class='flag-5'>平臺</b><b class='flag-5'>Android</b> HAL層故障排查:從lshal命令看透問題本質

    技術分享 | RK3568 Android11 如何實現自啟動應用

    隨著Android版本的不斷升級,對于應用權限的管理會更加苛刻。我司IAC-RK3568-Kit開發(fā)板默認搭載Android11,相比較之前RK3288的產品安卓版本變更較大,有些客戶
    的頭像 發(fā)表于 02-05 17:26 ?390次閱讀
    技術分享 | <b class='flag-5'>RK</b>3568 <b class='flag-5'>Android</b>11 如何實現自啟動應用

    深入解析RK平臺編譯核心:build.sh的知識點、調試技巧與開發(fā)價值

    在瑞芯微(RKLinux SDK 開發(fā)中,build.sh是整個編譯構建系統(tǒng)的“入口中樞”—— 它統(tǒng)一管理環(huán)境配置、命令解析、模塊構建與日志輸出,幾乎所有芯片(如 RK3588、RV
    的頭像 發(fā)表于 02-03 16:02 ?1853次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>RK</b><b class='flag-5'>平臺</b>編譯<b class='flag-5'>核心</b>:build.sh的知識點、調試技巧與開發(fā)價值

    MTK平臺LK階段mt_boot.c配置:SELINUX_STATUS 2的作用與影響

    在 MTK(聯發(fā)科)平臺Bootloader(以 LK/Little Kernel 為例)中,mt_boot.c是負責 Linux 內核啟動邏輯的
    的頭像 發(fā)表于 02-03 15:46 ?794次閱讀
    MTK<b class='flag-5'>平臺</b>LK階段mt_boot.<b class='flag-5'>c</b>配置:SELINUX_STATUS 2的作用與影響

    硬核進階:RK3576 Android15?驅動與系統(tǒng)開發(fā)實戰(zhàn)指南

    RK3576 探索之旅】系列文章導航及功能全景介紹(基于android14) 之前有出過系列的文章,但這是自己公司定制項目,暫時沒有相關硬件,有需求可以私信我,這個系列主要還是驅動的開發(fā),接下來
    的頭像 發(fā)表于 01-26 22:29 ?623次閱讀
    硬核進階:<b class='flag-5'>RK</b>3576 <b class='flag-5'>Android</b>15?驅動與系統(tǒng)開發(fā)實戰(zhàn)指南

    深入解析rk平臺Android Bootloader核心代碼:從啟動流程到AVB驗證

    android_bootloader.c核心代碼,帶你讀懂Android設備從Bootloader到內核的完整啟動邏輯,以及開發(fā)者關注這些代碼的
    的頭像 發(fā)表于 01-22 07:06 ?232次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>rk</b><b class='flag-5'>平臺</b><b class='flag-5'>Android</b> <b class='flag-5'>Bootloader</b><b class='flag-5'>核心</b>代碼:從啟動流程到AVB驗證

    Bootloader固件升級的步驟

    BootLoader 工程生成的 .hex 或者.bin 文件通常下載到 ROM 或 Flash 中的首地址,這樣可以保證上電后先運行ootLoader 程序。而 APP 工程生成的 .hex 或者 .bin
    發(fā)表于 11-19 07:41

    如何基于開發(fā)板RK3568 Android 11強制所有應用橫屏展示

    RK3568 Android 11強制所有應用橫屏展示,1、打開frameworks/base/core/java/android/content/pm/parsing/component
    的頭像 發(fā)表于 11-07 16:07 ?727次閱讀
    如何基于開發(fā)板<b class='flag-5'>RK</b>3568 <b class='flag-5'>Android</b> 11強制所有應用橫屏展示

    RK3576 Android 14.0 SDK開發(fā)指南(第一集)

    RK3576 Android 14.0 SDK代碼編譯 SDK下載到本地后大概70多個G 下載后要做個校驗 解壓后內核源碼 kernel代碼路徑說明 Android14支持6.1 版本
    發(fā)表于 05-20 08:43

    3種系統(tǒng)加持!飛凌嵌入式RK3576核心Linux、Android、桌面系統(tǒng)全兼容

    飛凌嵌入式FET3576-C核心板正式發(fā)布了新系統(tǒng)Forlinx Desktop 24.04。至此,FET3576-C核心板已完成Linux
    的頭像 發(fā)表于 04-02 16:00 ?1197次閱讀
    3種系統(tǒng)加持!飛凌嵌入式<b class='flag-5'>RK</b>3576<b class='flag-5'>核心</b>板<b class='flag-5'>Linux</b>、<b class='flag-5'>Android</b>、桌面系統(tǒng)全兼容

    為什么無法加載統(tǒng)一bootloader demo V2.1?

    使用的一種解決方法是使用來自不同 Project 的 pin_mux.c 和 pin_mux.h 文件,以便在 Project 中使用正確的引腳配置。 在 unified bootloader 軟件包
    發(fā)表于 04-02 08:28

    自定義RISC V的bootloader-v3

    在生成SoC時,會生成一個預定義bootloader .bin文件,用于指定soc的工程運行的地址,這包括在flash的存儲地址 ,加載到外存中的運行地址及在外存中分配的存儲空間的大小 。下面我們
    的頭像 發(fā)表于 03-10 09:05 ?1712次閱讀
    自定義RISC V的<b class='flag-5'>bootloader</b>-v3