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

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

代碼中的函數(shù)可分為7大類,覆蓋基礎(chǔ)工具元數(shù)據(jù)處理槽位管理啟動流程全鏈路,以下是關(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ù)存儲為大端)

be32toh

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

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

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

函數(shù)名

核心作用

spl_ab_data_verify_and_byteswap

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

spl_ab_data_update_crc_and_byteswap

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

spl_ab_data_init

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

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

函數(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

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

spl_ab_data_write

封裝更新CRC+寫入:先更新CRC32,再寫入存儲

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

函數(shù)名

核心作用

spl_slot_is_bootable

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

spl_get_lastboot

獲取上次啟動的槽位索引0=A1=B

spl_get_current_slot

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

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

函數(shù)名

核心作用

spl_ab_append_part_slot

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

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

函數(shù)名

核心作用

spl_slot_set_unbootable

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

spl_slot_normalize

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

spl_ab_decrease_tries

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

spl_ab_decrease_reset

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

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

函數(shù)名

核心作用

spl_ab_bootargs_append_slot

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

三、SPL階段A/B啟動核心流程圖

wKgZPGluucuACMd5AAEAMsHxd54329.png

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

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

1.快速定位啟動故障

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

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

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

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

2.定制A/B更新策略

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

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

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

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

3.適配不同硬件平臺

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

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

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

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

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

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

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

五、總結(jié)

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

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


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

    關(guān)注

    12

    文章

    4024

    瀏覽量

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

    關(guān)注

    41

    文章

    3747

    瀏覽量

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

    關(guān)注

    30

    文章

    4967

    瀏覽量

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

    關(guān)注

    0

    文章

    22

    瀏覽量

    16754
  • Rockchip
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

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

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

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

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

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

    在嵌入式系統(tǒng)啟動過程中,從按下電源鍵到操作系統(tǒng)開始運行,中間藏著一系列精密的初始化步驟。今天我們就來拆解 Rockchip 平臺 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'>啟動</b>的“第一棒”背后的秘密

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

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

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

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

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

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

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

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

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

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

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

    本文為創(chuàng)龍科技eMMC 配置核心板官方使用指南,聚焦 Linux 系統(tǒng)在該核心板上的應(yīng)用。主要內(nèi)容包括啟動卡與 “量產(chǎn)卡” 制作、兩種 eMMC 固化方式、分區(qū)與 OTA 升級說明、量及局部鏡像編譯、eMMC 讀寫性能測試,以
    的頭像 發(fā)表于 09-10 10:55 ?591次閱讀
    國產(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ū)別是什么?請問如何從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啟動流程疑問求解

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

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

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