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

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

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

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

深度解析SPL階段A/B分區(qū)啟動(dòng):spl_ab.c代碼全拆解

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

掃碼添加小助手

加入工程師交流群

嵌入式系統(tǒng)(尤其是Rockchip平臺(tái)Android設(shè)備)中,A/BSeamless Update)無縫更新是保障系統(tǒng)更新不丟數(shù)據(jù)、更新失敗可回滾的核心機(jī)制。而SPLSecondary Program Loader,二級(jí)程序加載器)作為系統(tǒng)啟動(dòng)的早期階段,負(fù)責(zé)初始化硬件、選擇啟動(dòng)分區(qū),spl_ab.c正是SPL層處理A/B分區(qū)啟動(dòng)的核心代碼。本文將從函數(shù)解析、核心流程、開發(fā)意義三個(gè)維度,徹底拆解這段代碼。

一、A/B分區(qū)與SPL的核心作用

A/B分區(qū)將系統(tǒng)分為兩個(gè)獨(dú)立的槽位(Slot A/Slot B),更新時(shí)先更新非當(dāng)前啟動(dòng)的槽位,更新完成后切換槽位啟動(dòng);若啟動(dòng)失敗,自動(dòng)回退到原槽位。

SPLBootLoader的早期階段,執(zhí)行優(yōu)先級(jí)最高,spl_ab.c的核心目標(biāo)是:讀取A/B元數(shù)據(jù)、判斷槽位可啟動(dòng)性、選擇最優(yōu)啟動(dòng)槽位、處理啟動(dòng)失敗后的嘗試次數(shù)遞減與系統(tǒng)重置。

二、核心函數(shù)分類解析

代碼中的函數(shù)可分為7大類,覆蓋基礎(chǔ)工具元數(shù)據(jù)處理槽位管理啟動(dòng)流程全鏈路,以下是關(guān)鍵函數(shù)的作用拆解:

1.基礎(chǔ)工具函數(shù):解決通用問題

函數(shù)名

核心作用

safe_memcmp

安全的內(nèi)存比較,無數(shù)據(jù)依賴分支(避免側(cè)信道攻擊),返回兩內(nèi)存區(qū)域是否不相等(0=相等,非0=不等)

htobe32

主機(jī)字節(jié)序大端字節(jié)序轉(zhuǎn)換(A/B元數(shù)據(jù)存儲(chǔ)為大端)

be32toh

大端字節(jié)序主機(jī)字節(jié)序轉(zhuǎn)換(讀取元數(shù)據(jù)后適配本地CPU

2. A/B元數(shù)據(jù)處理:校驗(yàn)/更新/初始化

A/B元數(shù)據(jù)(AvbABData)存儲(chǔ)在misc分區(qū),包含槽位優(yōu)先級(jí)、剩余嘗試次數(shù)、啟動(dòng)成功標(biāo)記等關(guān)鍵信息,這組函數(shù)是元數(shù)據(jù)操作的核心:

函數(shù)名

核心作用

spl_ab_data_verify_and_byteswap

校驗(yàn)元數(shù)據(jù)合法性:
1.
檢查魔術(shù)字(
AVB_AB_MAGIC)是否正確;
2.
轉(zhuǎn)換CRC32為主機(jī)序;
3.
檢查版本兼容性(主版本不超過支持值);
4.
校驗(yàn)CRC32(排除元數(shù)據(jù)損壞);
校驗(yàn)通過則拷貝并轉(zhuǎn)換字節(jié)序到目標(biāo)結(jié)構(gòu)體

spl_ab_data_update_crc_and_byteswap

更新元數(shù)據(jù)的CRC32:先拷貝數(shù)據(jù),再計(jì)算CRC32并轉(zhuǎn)換為大端序(用于寫入存儲(chǔ))

spl_ab_data_init

初始化默認(rèn)元數(shù)據(jù):
-
魔術(shù)字、版本號(hào)初始化;
- Slot A
優(yōu)先級(jí)最高,Slot B次之;
-
兩槽位剩余嘗試次數(shù)設(shè)為最大值,啟動(dòng)成功標(biāo)記置0

3.元數(shù)據(jù)讀寫:對(duì)接存儲(chǔ)層

函數(shù)名

核心作用

spl_read_ab_metadata

misc分區(qū)指定偏移讀取元數(shù)據(jù)到內(nèi)存(單次讀512字節(jié),適配塊設(shè)備讀寫粒度)

spl_write_ab_metadata

將內(nèi)存中的元數(shù)據(jù)寫入misc分區(qū)指定偏移

spl_ab_data_read

封裝讀取+校驗(yàn):讀取失敗/校驗(yàn)失敗時(shí),初始化新元數(shù)據(jù)并寫入misc分區(qū)

spl_ab_data_write

封裝更新CRC+寫入:先更新CRC32,再寫入存儲(chǔ)

4.槽位選擇:核心決策邏輯

函數(shù)名

核心作用

spl_slot_is_bootable

判斷槽位是否可啟動(dòng):優(yōu)先級(jí)>0且(已成功啟動(dòng) 或 剩余嘗試次數(shù)>0

spl_get_lastboot

獲取上次啟動(dòng)的槽位索引0=A,1=B

spl_get_current_slot

選擇當(dāng)前要啟動(dòng)的槽位(核心函數(shù)):
1.
優(yōu)先使用緩存的
last_slot_index(避免重復(fù)計(jì)算);
2.
讀取并校驗(yàn)元數(shù)據(jù);
3.
按規(guī)則選槽位:
-
兩槽位都可啟動(dòng):選優(yōu)先級(jí)高的(同優(yōu)先級(jí)選A);
-
僅一個(gè)可啟動(dòng):選該槽位;
-
都不可啟動(dòng):回退到上次啟動(dòng)的槽位;
4.
緩存結(jié)果并返回槽位后綴(_a/_b

5.分區(qū)名處理:適配槽位后綴

函數(shù)名

核心作用

spl_ab_append_part_slot

給分區(qū)名追加槽位后綴(如bootboot_a);misc分區(qū)例外(無后綴);獲取槽位失敗時(shí)直接返回原分區(qū)名

6.槽位狀態(tài)管理:處理啟動(dòng)失敗

函數(shù)名

核心作用

spl_slot_set_unbootable

標(biāo)記槽位為不可啟動(dòng):優(yōu)先級(jí)、剩余嘗試次數(shù)、啟動(dòng)成功標(biāo)記全置0

spl_slot_normalize

規(guī)范化槽位狀態(tài)(處理非法場(chǎng)景):
-
優(yōu)先級(jí)>0但嘗試次數(shù)=0且未成功置為不可啟動(dòng);
-
優(yōu)先級(jí)>0但嘗試次數(shù)>0且已成功置為不可啟動(dòng);
-
優(yōu)先級(jí)≤0→直接置為不可啟動(dòng)

spl_ab_decrease_tries

啟動(dòng)失敗時(shí)減少當(dāng)前槽位嘗試次數(shù):
1.
獲取當(dāng)前槽位;
2.
讀取并規(guī)范化兩槽位狀態(tài);
3.
若當(dāng)前槽位未成功且有剩余嘗試次數(shù),減1
4.
元數(shù)據(jù)變化則寫入
misc分區(qū)

spl_ab_decrease_reset

啟動(dòng)失敗后重置系統(tǒng):
1.
檢查是否有可啟動(dòng)槽位;
2.
調(diào)用
spl_ab_decrease_tries減嘗試次數(shù);
3.
仍有可啟動(dòng)槽位則執(zhí)行系統(tǒng)重置,無則返回錯(cuò)誤

7.啟動(dòng)參數(shù)傳遞:對(duì)接內(nèi)核

函數(shù)名

核心作用

spl_ab_bootargs_append_slot

給設(shè)備樹(FDT)的啟動(dòng)參數(shù)(bootargs)追加槽位后綴(如android.slot_suffix=_a),讓內(nèi)核感知當(dāng)前啟動(dòng)槽位

三、SPL階段A/B啟動(dòng)核心流程圖

wKgZPGluucuACMd5AAEAMsHxd54329.png

四、開發(fā)者關(guān)注這段代碼的核心意義

對(duì)于嵌入式開發(fā)者(尤其是Rockchip/Android BootLoader開發(fā)者),理解spl_ab.c是保障A/B啟動(dòng)穩(wěn)定的關(guān)鍵,核心價(jià)值體現(xiàn)在5個(gè)方面:

1.快速定位啟動(dòng)故障

當(dāng)設(shè)備出現(xiàn)“A/B啟動(dòng)失敗、卡在SPL階段、槽位切換異常時(shí),可通過代碼日志(如“CRC32 does not match”“No bootable slots found”)定位根因:

?元數(shù)據(jù)CRC不匹配:misc分區(qū)損壞,spl_ab_data_read會(huì)自動(dòng)初始化元數(shù)據(jù);

?無可用槽位:兩槽位嘗試次數(shù)耗盡,需手動(dòng)重置元數(shù)據(jù);

?槽位被標(biāo)記為不可啟動(dòng):檢查spl_slot_normalize是否觸發(fā)了非法狀態(tài)處理。

2.定制A/B更新策略

默認(rèn)邏輯可根據(jù)產(chǎn)品需求調(diào)整:

?調(diào)整默認(rèn)優(yōu)先級(jí)/嘗試次數(shù):修改spl_ab_data_init中的AVB_AB_MAX_PRIORITY/AVB_AB_MAX_TRIES_REMAINING

?自定義槽位選擇規(guī)則:修改spl_get_current_slot(如優(yōu)先級(jí)相同時(shí)選上次啟動(dòng)的槽位,而非默認(rèn)的Slot A);

?調(diào)整啟動(dòng)失敗后的行為:修改spl_ab_decrease_reset(如增加重試次數(shù)閾值,或取消自動(dòng)重置)。

3.適配不同硬件平臺(tái)

不同存儲(chǔ)設(shè)備(eMMC/NAND/SD卡)的塊設(shè)備讀寫(blk_dread/blk_dwrite)邏輯有差異,需確保spl_read/write_ab_metadata適配硬件;不同CPU架構(gòu)的字節(jié)序可能不同,需驗(yàn)證htobe32/be32toh的正確性。

4.提升系統(tǒng)穩(wěn)定性

?safe_memcmp避免側(cè)信道攻擊,提升元數(shù)據(jù)比較的安全性;

?spl_save_metadata_if_changed僅在元數(shù)據(jù)變化時(shí)寫入存儲(chǔ),減少misc分區(qū)的寫操作,延長(zhǎng)存儲(chǔ)壽命;

?spl_slot_normalize處理非法狀態(tài),避免因元數(shù)據(jù)異常導(dǎo)致的啟動(dòng)邏輯崩潰。

5.適配Android無縫更新標(biāo)準(zhǔn)

Android A/B無縫更新的核心是槽位管理,這段代碼是SPL層對(duì)接Android A/B規(guī)范的關(guān)鍵,確保更新后能正確切換槽位啟動(dòng),失敗時(shí)自動(dòng)回滾,符合GoogleA/B更新標(biāo)準(zhǔn)。

五、總結(jié)

spl_ab.cSPL階段A/B分區(qū)啟動(dòng)的大腦,從元數(shù)據(jù)讀寫、槽位決策到啟動(dòng)失敗處理,覆蓋了A/B啟動(dòng)的全核心流程。對(duì)于嵌入式開發(fā)者而言,理解這段代碼不僅能快速定位啟動(dòng)故障,還能根據(jù)產(chǎn)品需求定制更新策略,保障設(shè)備在無縫更新場(chǎng)景下的穩(wěn)定性與兼容性。

無論是調(diào)試A/B啟動(dòng)問題,還是適配新硬件平臺(tái),spl_ab.c都是必須深入掌握的核心模塊——它是連接硬件初始化與系統(tǒng)啟動(dòng)的關(guān)鍵橋梁,也是保障Android無縫更新落地的基礎(chǔ)。


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

    關(guān)注

    12

    文章

    4026

    瀏覽量

    133988
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3747

    瀏覽量

    133633
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73965
  • spl
    spl
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    16754
  • Rockchip
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Microchip 93XX56A/B/C系列2K Microwire兼容串行EEPROM深度解析

    Microchip 93XX56A/B/C系列2K Microwire兼容串行EEPROM深度解析 在電子設(shè)計(jì)領(lǐng)域,串行EEPROM是一種常
    的頭像 發(fā)表于 03-02 16:15 ?76次閱讀

    實(shí)戰(zhàn)排障|RK平臺(tái)啟動(dòng)卡死、SPL崩潰,兩行日志直接定位DDR硬件死穴!

    在嵌入式Linux產(chǎn)品開發(fā)中,U-Boot SPL啟動(dòng)崩潰、主板不上電、啟動(dòng)卡死在初始化階段是最讓人頭疼的硬故障之一。日志亂碼、CPU異常復(fù)位、看不到完整
    的頭像 發(fā)表于 02-24 15:22 ?768次閱讀
    實(shí)戰(zhàn)排障|RK平臺(tái)<b class='flag-5'>啟動(dòng)</b>卡死、<b class='flag-5'>SPL</b>崩潰,兩行日志直接定位DDR硬件死穴!

    Microchip 93XX66A/B/C系列4Kbit低電壓串行EEPROM深度解析

    Microchip 93XX66A/B/C系列4Kbit低電壓串行EEPROM深度解析 在電子設(shè)計(jì)領(lǐng)域,串行EEPROM是不可或缺的存儲(chǔ)元件
    的頭像 發(fā)表于 02-10 15:35 ?861次閱讀

    U-Boot SPL核心文件spl.c深度解析:從啟動(dòng)流程到調(diào)試優(yōu)化

    解析 U-Boot 中 spl.c 文件的功能與作用,探討其在系統(tǒng)調(diào)試和優(yōu)化中的價(jià)值,并通過流程圖和腦圖幫助開發(fā)者快速掌握核心要點(diǎn)。
    的頭像 發(fā)表于 02-05 14:08 ?141次閱讀
    U-Boot <b class='flag-5'>SPL</b>核心文件<b class='flag-5'>spl.c</b><b class='flag-5'>深度</b><b class='flag-5'>解析</b>:從<b class='flag-5'>啟動(dòng)</b>流程到調(diào)試優(yōu)化

    深入解析U-Boot TPL代碼:嵌入式啟動(dòng)的“第一棒”背后的秘密

    在嵌入式系統(tǒng)啟動(dòng)過程中,從按下電源鍵到操作系統(tǒng)開始運(yùn)行,中間藏著一系列精密的初始化步驟。今天我們就來拆解 Rockchip 平臺(tái) U-Boot 中的 TPL(Tiny Program Loader)階段核心
    的頭像 發(fā)表于 02-05 14:07 ?1059次閱讀
    深入<b class='flag-5'>解析</b>U-Boot TPL<b class='flag-5'>代碼</b>:嵌入式<b class='flag-5'>啟動(dòng)</b>的“第一棒”背后的秘密

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

    下android_bootloader.c的核心代碼,帶你讀懂Android設(shè)備從Bootloader到內(nèi)核的完整啟動(dòng)邏輯,以及開發(fā)者關(guān)注這些代碼的核心價(jià)值。 一、
    的頭像 發(fā)表于 01-22 07:06 ?268次閱讀
    深入<b class='flag-5'>解析</b>rk平臺(tái)Android Bootloader核心<b class='flag-5'>代碼</b>:從<b class='flag-5'>啟動(dòng)</b>流程到AVB驗(yàn)證

    德州儀器LM5100A/B/C和LM5101A/B/C系列高壓柵極驅(qū)動(dòng)器的深度解析

    德州儀器LM5100A/B/C和LM5101A/B/C系列高壓柵極驅(qū)動(dòng)器的
    的頭像 發(fā)表于 01-11 18:05 ?1073次閱讀

    Texas Instruments LM5100A/B/C和LM5101A/B/C高壓柵極驅(qū)動(dòng)器深度解析

    Texas Instruments LM5100A/B/C和LM5101A/B/C高壓柵極驅(qū)動(dòng)器
    的頭像 發(fā)表于 01-11 17:45 ?1082次閱讀

    深度剖析LM5100A/B/C與LM5101A/B/C高壓柵極驅(qū)動(dòng)器

    深度剖析LM5100A/B/C與LM5101A/B/C
    的頭像 發(fā)表于 01-11 17:45 ?1083次閱讀

    d1哪吒開發(fā)板的啟動(dòng)流程分析

    的介質(zhì)中讀取SPL,然后放到SRAM中執(zhí)行,同時(shí)也通過FEL運(yùn)行環(huán)境。 3.啟動(dòng)SPL 當(dāng)BROM啟動(dòng)完成后,接下來要去存儲(chǔ)介質(zhì)中尋找SPL
    發(fā)表于 10-29 06:44

    國(guó)產(chǎn)!志T113-i 雙核Cortex-A7@1.2GHz 工業(yè)開發(fā)板—eMMC配置核心板使用說明(二)

    本文為創(chuàng)龍科技eMMC 配置核心板官方使用指南,聚焦 Linux 系統(tǒng)在該核心板上的應(yīng)用。主要內(nèi)容包括啟動(dòng)卡與 “量產(chǎn)卡” 制作、兩種 eMMC 固化方式、分區(qū)與 OTA 升級(jí)說明、量及局部鏡像編譯、eMMC 讀寫性能測(cè)試,以
    的頭像 發(fā)表于 09-10 10:55 ?596次閱讀
    國(guó)產(chǎn)!<b class='flag-5'>全</b>志T113-i 雙核Cortex-<b class='flag-5'>A</b>7@1.2GHz 工業(yè)開發(fā)板—eMMC配置核心板使用說明(二)

    fn_u-boot-spl.bin和u-boot-spl.bin區(qū)別是什么?請(qǐng)問如何從u-boot-spl.bin生成fn_u-boot-spl.bin?

    fn_u-boot-spl.bin = bootrom頭 + u-boot-spl.bin ;生成過程見后面代碼片段; bootrom頭(格式詳見) + u-boot-spl.bin(
    發(fā)表于 07-11 07:58

    求助,關(guān)于K230啟動(dòng)流程疑問求解

    打印,正常在啟動(dòng)的時(shí)候是uboot-spl 啟動(dòng)opensbi,opensbi 啟動(dòng)uboot proper, 然后再啟動(dòng)linux內(nèi)核,但
    發(fā)表于 07-11 06:42

    十種主流電機(jī)拆解解析:內(nèi)部結(jié)構(gòu)大揭秘!

    點(diǎn)擊附件查看全文*附件:十種主流電機(jī)拆解解析:內(nèi)部結(jié)構(gòu)大揭秘!.doc (免責(zé)聲明:本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請(qǐng)第一時(shí)間告知,刪除內(nèi)容!)
    發(fā)表于 04-01 14:25

    i.mx8m如何在u-boot SPL階段啟用pwm?

    () 差異 --git a/board/toradex/verdin-imx8mm/spl.c b/board/toradex/verdin-imx8mm/spl.c 索引 2106
    發(fā)表于 03-21 07:51