日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(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 ? 來(lái)源:Linux1024 ? 作者:Linux1024 ? 2026-01-20 07:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式系統(tǒng)(尤其是Rockchip平臺(tái)Android設(shè)備)中,A/BSeamless Update)無(wú)縫更新是保障系統(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ù)解析、核心流程、開(kāi)發(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ù)分類(lèi)解析

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

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

函數(shù)名

核心作用

safe_memcmp

安全的內(nèi)存比較,無(wú)數(shù)據(jù)依賴(lài)分支(避免側(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.
檢查版本兼容性(主版本不超過(guò)支持值);
4.
校驗(yàn)CRC32(排除元數(shù)據(jù)損壞);
校驗(yàn)通過(guò)則拷貝并轉(zhuǎn)換字節(jié)序到目標(biāo)結(jié)構(gòu)體

spl_ab_data_update_crc_and_byteswap

更新元數(shù)據(jù)的CRC32:先拷貝數(shù)據(jù),再計(jì)算CRC32并轉(zhuǎn)換為大端序(用于寫(xiě)入存儲(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ù)讀寫(xiě):對(duì)接存儲(chǔ)層

函數(shù)名

核心作用

spl_read_ab_metadata

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

spl_write_ab_metadata

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

spl_ab_data_read

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

spl_ab_data_write

封裝更新CRC+寫(xiě)入:先更新CRC32,再寫(xiě)入存儲(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ū)例外(無(wú)后綴);獲取槽位失敗時(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ù)變化則寫(xiě)入
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)重置,無(wú)則返回錯(cuò)誤

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

函數(shù)名

核心作用

spl_ab_bootargs_append_slot

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

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

wKgZPGluucuACMd5AAEAMsHxd54329.png

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

對(duì)于嵌入式開(kāi)發(fā)者(尤其是Rockchip/Android BootLoader開(kāi)發(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í),可通過(guò)代碼日志(如“CRC32 does not match”“No bootable slots found”)定位根因:

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

?無(wú)可用槽位:兩槽位嘗試次數(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è)備讀寫(xiě)(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í)寫(xiě)入存儲(chǔ),減少misc分區(qū)的寫(xiě)操作,延長(zhǎng)存儲(chǔ)壽命;

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

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

Android A/B無(wú)縫更新的核心是槽位管理,這段代碼是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ù)讀寫(xiě)、槽位決策到啟動(dòng)失敗處理,覆蓋了A/B啟動(dòng)的全核心流程。對(duì)于嵌入式開(kāi)發(fā)者而言,理解這段代碼不僅能快速定位啟動(dòng)故障,還能根據(jù)產(chǎn)品需求定制更新策略,保障設(shè)備在無(wú)縫更新場(chǎng)景下的穩(wěn)定性與兼容性。

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


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

    關(guān)注

    12

    文章

    4035

    瀏覽量

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

    關(guān)注

    41

    文章

    3831

    瀏覽量

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

    關(guān)注

    30

    文章

    4977

    瀏覽量

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

    關(guān)注

    0

    文章

    22

    瀏覽量

    16803
  • Rockchip
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    電子工程師必看:PCA9543A/43B 2 通道 I2C 總線開(kāi)關(guān)深度解析

    電子工程師必看:PCA9543A/43B 2 通道 I2C 總線開(kāi)關(guān)深度解析 在電子工程師的日常設(shè)計(jì)中,I2
    的頭像 發(fā)表于 04-14 16:50 ?400次閱讀

    PIC16C63A/65B/73B/74B微控制器:功能、特性與應(yīng)用解析

    PIC16C63A/65B/73B/74B微控制器:功能、特性與應(yīng)用解析 在電子工程師的日常工
    的頭像 發(fā)表于 04-07 16:40 ?216次閱讀

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

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

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

    到外部網(wǎng)絡(luò)設(shè)備時(shí),U-Boot SPL 和 ATF/BL31 啟動(dòng)消息會(huì)回顯到外部設(shè)備的控制臺(tái)。如果外部設(shè)備也在啟動(dòng),它可以將這些字符解釋為輸入命令,從而可能損壞其引導(dǎo)加載程序或配置。 我成功靜音的內(nèi)容
    發(fā)表于 03-09 08:28

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

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

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

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

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

    解析 U-Boot 中 spl.c 文件的功能與作用,探討其在系統(tǒng)調(diào)試和優(yōu)化中的價(jià)值,并通過(guò)流程圖和腦圖幫助開(kāi)發(fā)者快速掌握核心要點(diǎn)。
    的頭像 發(fā)表于 02-05 14:08 ?538次閱讀
    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)過(guò)程中,從按下電源鍵到操作系統(tǒng)開(kāi)始運(yùn)行,中間藏著一系列精密的初始化步驟。今天我們就來(lái)拆解 Rockchip 平臺(tái) U-Boot 中的 TPL(Tiny Program Loader)階段核心
    的頭像 發(fā)表于 02-05 14:07 ?1320次閱讀
    深入<b class='flag-5'>解析</b>U-Boot TPL<b class='flag-5'>代碼</b>:嵌入式<b class='flag-5'>啟動(dòng)</b>的“第一棒”背后的秘密

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

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

    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 ?1305次閱讀

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

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

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

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

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

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

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

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

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

    打印,正常在啟動(dòng)的時(shí)候是uboot-spl 啟動(dòng)opensbi,opensbi 啟動(dòng)uboot proper, 然后再啟動(dòng)linux內(nèi)核,但
    發(fā)表于 07-11 06:42
    兴宁市| 扎鲁特旗| 白城市| 连城县| 栖霞市| 济南市| 定州市| 澎湖县| 祁东县| 怀安县| 合川市| 临武县| 顺义区| 宣汉县| 呼伦贝尔市| 七台河市| 信宜市| 雷波县| 镇雄县| 从江县| 定边县| 谢通门县| 鹤岗市| 喀喇沁旗| 新疆| 许昌市| 禹州市| 新竹县| 郸城县| 东乌| 郑州市| 专栏| 太和县| 嘉义市| 无棣县| 印江| 吉林市| 汉寿县| 万山特区| 精河县| 华阴市|