伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

一、A/B分區與SPL的核心作用

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

SPLBootLoader的早期階段,執行優先級最高,spl_ab.c的核心目標是:讀取A/B元數據、判斷槽位可啟動性、選擇最優啟動槽位、處理啟動失敗后的嘗試次數遞減與系統重置

二、核心函數分類解析

代碼中的函數可分為7大類,覆蓋基礎工具元數據處理槽位管理啟動流程全鏈路,以下是關鍵函數的作用拆解:

1.基礎工具函數:解決通用問題

函數名

核心作用

safe_memcmp

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

htobe32

主機字節序大端字節序轉換(A/B元數據存儲為大端)

be32toh

大端字節序主機字節序轉換(讀取元數據后適配本地CPU

2. A/B元數據處理:校驗/更新/初始化

A/B元數據(AvbABData)存儲在misc分區,包含槽位優先級、剩余嘗試次數、啟動成功標記等關鍵信息,這組函數是元數據操作的核心:

函數名

核心作用

spl_ab_data_verify_and_byteswap

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

spl_ab_data_update_crc_and_byteswap

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

spl_ab_data_init

初始化默認元數據:
-
魔術字、版本號初始化;
- Slot A
優先級最高,Slot B次之;
-
兩槽位剩余嘗試次數設為最大值,啟動成功標記置0

3.元數據讀寫:對接存儲層

函數名

核心作用

spl_read_ab_metadata

misc分區指定偏移讀取元數據到內存(單次讀512字節,適配塊設備讀寫粒度)

spl_write_ab_metadata

將內存中的元數據寫入misc分區指定偏移

spl_ab_data_read

封裝讀取+校驗:讀取失敗/校驗失敗時,初始化新元數據并寫入misc分區

spl_ab_data_write

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

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

函數名

核心作用

spl_slot_is_bootable

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

spl_get_lastboot

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

spl_get_current_slot

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

5.分區名處理:適配槽位后綴

函數名

核心作用

spl_ab_append_part_slot

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

6.槽位狀態管理:處理啟動失敗

函數名

核心作用

spl_slot_set_unbootable

標記槽位為不可啟動:優先級、剩余嘗試次數、啟動成功標記全置0

spl_slot_normalize

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

spl_ab_decrease_tries

啟動失敗時減少當前槽位嘗試次數:
1.
獲取當前槽位;
2.
讀取并規范化兩槽位狀態;
3.
若當前槽位未成功且有剩余嘗試次數,減1
4.
元數據變化則寫入
misc分區

spl_ab_decrease_reset

啟動失敗后重置系統:
1.
檢查是否有可啟動槽位;
2.
調用
spl_ab_decrease_tries減嘗試次數;
3.
仍有可啟動槽位則執行系統重置,無則返回錯誤

7.啟動參數傳遞:對接內核

函數名

核心作用

spl_ab_bootargs_append_slot

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

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

wKgZPGluucuACMd5AAEAMsHxd54329.png

四、開發者關注這段代碼的核心意義

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

1.快速定位啟動故障

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

?元數據CRC不匹配:misc分區損壞,spl_ab_data_read會自動初始化元數據;

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

?槽位被標記為不可啟動:檢查spl_slot_normalize是否觸發了非法狀態處理。

2.定制A/B更新策略

默認邏輯可根據產品需求調整:

?調整默認優先級/嘗試次數:修改spl_ab_data_init中的AVB_AB_MAX_PRIORITY/AVB_AB_MAX_TRIES_REMAINING

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

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

3.適配不同硬件平臺

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

4.提升系統穩定性

?safe_memcmp避免側信道攻擊,提升元數據比較的安全性;

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

?spl_slot_normalize處理非法狀態,避免因元數據異常導致的啟動邏輯崩潰。

5.適配Android無縫更新標準

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

五、總結

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

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


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

    關注

    12

    文章

    4033

    瀏覽量

    134267
  • 嵌入式系統
    +關注

    關注

    41

    文章

    3766

    瀏覽量

    133782
  • 代碼
    +關注

    關注

    30

    文章

    4974

    瀏覽量

    74210
  • spl
    spl
    +關注

    關注

    0

    文章

    22

    瀏覽量

    16784
  • Rockchip
    +關注

    關注

    0

    文章

    92

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    更新 SPL 和 U-Boot的提示和技巧

    的 U-Boot 和 SPL 文件并將它們加載到 U 盤上 7 連接將 USB 記憶棒連接到 VF2 板并將其安裝在文件夾中 8 更新來自終端的固件 9 驗證使用命令 cat /proc/mtd 并檢查如下
    發表于 03-20 08:15

    如何使 i.MX93 上的 U-Boot SPL 和 ATF/BL31輸出靜音呢?

    到外部網絡設備時,U-Boot SPL 和 ATF/BL31 啟動消息會回顯到外部設備的控制臺。如果外部設備也在啟動,它可以將這些字符解釋為輸入命令,從而可能損壞其引導加載程序或配置。 我成功靜音的內容
    發表于 03-09 08:28

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

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

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

    在嵌入式Linux產品開發中,U-Boot SPL啟動崩潰、主板不上電、啟動卡死在初始化階段是最讓人頭疼的硬故障之一。日志亂碼、CPU異常復位、看不到完整
    的頭像 發表于 02-24 15:22 ?924次閱讀
    實戰排障|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深度解析 在電子設計領域,串行EEPROM是不可或缺的存儲元件
    的頭像 發表于 02-10 15:35 ?2055次閱讀

    U-Boot SPL核心文件spl.c深度解析:從啟動流程到調試優化

    解析 U-Boot 中 spl.c 文件的功能與作用,探討其在系統調試和優化中的價值,并通過流程圖和腦圖幫助開發者快速掌握核心要點。
    的頭像 發表于 02-05 14:08 ?317次閱讀
    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>流程到調試優化

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

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

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

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

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

    Texas Instruments LM5100A/B/C和LM5101A/B/C高壓柵極驅動器
    的頭像 發表于 01-11 17:45 ?1221次閱讀

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

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

    d1哪吒開發板的啟動流程分析

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

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

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

    fn_u-boot-spl.bin和u-boot-spl.bin區別是什么?請問如何從u-boot-spl.bin生成fn_u-boot-spl.bin?

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

    求助,關于K230啟動流程疑問求解

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

    十種主流電機拆解解析:內部結構大揭秘!

    點擊附件查看全文*附件:十種主流電機拆解解析:內部結構大揭秘!.doc (免責聲明:本文系網絡轉載,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請第一時間告知,刪除內容!)
    發表于 04-01 14:25