国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

一、文件核心定位

android_bootloader.c是U-Boot中實(shí)現(xiàn)Android啟動流程的核心模塊,核心職責(zé)包括:

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

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

3.加載Android內(nèi)核/Recovery鏡像到指定內(nèi)存地址;

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

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

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

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

二、核心函數(shù)拆解

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

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

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

(1)android_bootloader_message_load/write

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

?關(guān)鍵邏輯

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

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

?讀寫失敗時(shí)打印錯(cuò)誤日志,返回負(fù)值。

(2)android_bootloader_load_and_clear_mode

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

?關(guān)鍵邏輯

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

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

bootonce-bootloader:單次進(jìn)入Bootloader,讀取后清空BCB;

boot-recovery/boot-fastboot:進(jìn)入Recovery模式;

無匹配指令:默認(rèn)NORMAL模式。

(3)android_bcb_write

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

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

2. AVB驗(yàn)證模塊

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

(1)android_slot_verify

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

?關(guān)鍵邏輯

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

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

c.調(diào)用avb_slot_verify執(zhí)行哈希樹驗(yàn)證;

d.根據(jù)驗(yàn)證結(jié)果更新androidboot.verifiedbootstate(green/orange/yellow/red);

e.驗(yàn)證失敗時(shí)標(biāo)記當(dāng)前槽位為不可啟動。

(2)avb_image_distribute_prepare/finish

?作用:AVB驗(yàn)證前后的鏡像內(nèi)存管理;

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

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

3.鏡像加載模塊

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

(1)android_image_load_by_partname

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

?關(guān)鍵邏輯

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

b.調(diào)用android_image_load將鏡像加載到內(nèi)存,并返回加載后的地址。

(2)android_bootloader_boot_flow

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

?核心流程:啟動模式檢測→ AVB驗(yàn)證→鏡像加載→命令行組裝→內(nèi)核啟動。

4.內(nèi)核啟動模塊

負(fù)責(zé)內(nèi)核啟動的最終執(zhí)行,包括內(nèi)存分配、參數(shù)傳遞。

android_bootloader_boot_kernel

?作用:啟動Android內(nèi)核;

?關(guān)鍵邏輯

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

b.分配解壓內(nèi)存,釋放壓縮鏡像占用的內(nèi)存;

c.組裝bootm參數(shù)(內(nèi)核地址、設(shè)備樹地址);

d.調(diào)用do_bootm_states執(zhí)行內(nèi)核啟動流程。

5.命令行組裝模塊

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

android_assemble_cmdline

?作用:整合多源參數(shù),生成最終的內(nèi)核cmdline;

?整合內(nèi)容

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

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

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

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

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

6. DTBO疊加模塊

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

android_fdt_overlay_apply

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

?關(guān)鍵邏輯

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

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

c.擴(kuò)容主設(shè)備樹內(nèi)存,應(yīng)用疊加層;

d.失敗時(shí)回滾主設(shè)備樹備份。

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

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

1.流程總覽

wKgZPGlgbzKAOmv4AAJ4BrBWUqk590.png

2.流程分步解析

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

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

階段2:AVB驗(yàn)證(可選)

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

?若設(shè)備解鎖,跳過嚴(yán)格驗(yàn)證,僅標(biāo)記驗(yàn)證狀態(tài)為orange(未驗(yàn)證);

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

階段3:鏡像加載

根據(jù)啟動模式選擇對應(yīng)的分區(qū)(正常模式選boot,Recovery模式選recovery/boot),調(diào)用android_image_load將鏡像加載到指定內(nèi)存地址。

階段4:命令行組裝

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

階段5:內(nèi)核啟動

?適配DTBO疊加層(若有),擴(kuò)容主設(shè)備樹并應(yīng)用疊加;

?根據(jù)內(nèi)核壓縮類型分配解壓內(nèi)存,釋放壓縮鏡像內(nèi)存;

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

四、核心亮點(diǎn)與設(shè)計(jì)思路

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

2.容錯(cuò)機(jī)制:BCB讀取失敗時(shí)默認(rèn)進(jìn)入正常模式,AVB驗(yàn)證失敗時(shí)標(biāo)記槽位為不可啟動,保障設(shè)備基礎(chǔ)可用性;

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

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

五、總結(jié)

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

理解這個(gè)文件的邏輯,不僅能掌握Android/linux設(shè)備的啟動流程,更能為定制化Bootloader、排查啟動故障(如Recovery無法進(jìn)入、AVB驗(yàn)證失敗)提供核心思路。對于Android底層開發(fā)、設(shè)備調(diào)試人員來說,這個(gè)文件是必須深入理解的核心模塊。

審核編輯 黃宇

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

    關(guān)注

    12

    文章

    4024

    瀏覽量

    133973
  • u-boot
    +關(guān)注

    關(guān)注

    0

    文章

    135

    瀏覽量

    39747
  • bootloader
    +關(guān)注

    關(guān)注

    2

    文章

    244

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

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

    RK?Android平臺開發(fā)的同學(xué),大概率都遇到過這些音頻問題:插耳機(jī)沒聲音、通話音量忽大忽小、新增的HDMI聲卡沒適配、錄音增益異常…?這些問題看似五花八門,根源卻大概率指向同一個(gè)核心
    的頭像 發(fā)表于 02-26 08:08 ?81次閱讀
    <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作為核心的啟動加載程序,負(fù)責(zé)完成鏡像解析、校驗(yàn)、加載等關(guān)鍵流程。而image.c正是U-Bo
    的頭像 發(fā)表于 02-24 16:46 ?1441次閱讀
    <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設(shè)備OTA升級教程:從原理到U盤實(shí)操

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

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

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

    技術(shù)分享 | RK3568 Android11 如何實(shí)現(xiàn)自啟動應(yīng)用

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

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

    在瑞芯微(RKLinux SDK 開發(fā)中,build.sh是整個(gè)編譯構(gòu)建系統(tǒng)的“入口中樞”—— 它統(tǒng)一管理環(huán)境配置、命令解析、模塊構(gòu)建與日志輸出,幾乎所有芯片(如 RK3588、RV
    的頭像 發(fā)表于 02-03 16:02 ?1891次閱讀
    <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的知識點(diǎn)、調(diào)試技巧與開發(fā)價(jià)值

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

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

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

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

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

    android_bootloader.c核心代碼,帶你讀懂Android設(shè)備從Bootloader到內(nèi)核的完整啟動邏輯,以及開發(fā)者關(guān)注這些代碼的
    的頭像 發(fā)表于 01-22 07:06 ?257次閱讀
    <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驗(yàn)證

    Bootloader固件升級的步驟

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

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

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

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

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

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

    飛凌嵌入式FET3576-C核心板正式發(fā)布了新系統(tǒng)Forlinx Desktop 24.04。至此,F(xiàn)ET3576-C核心板已完成Linux
    的頭像 發(fā)表于 04-02 16:00 ?1201次閱讀
    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時(shí),會生成一個(gè)預(yù)定義bootloader .bin文件,用于指定soc的工程運(yùn)行的地址,這包括在flash的存儲地址 ,加載到外存中的運(yùn)行地址及在外存中分配的存儲空間的大小 。下面我們
    的頭像 發(fā)表于 03-10 09:05 ?1712次閱讀
    自定義RISC V的<b class='flag-5'>bootloader</b>-v3