chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

深入解析U-Boot image.c:RK平臺(tái)鏡像處理核心邏輯

jf_44130326 ? 來(lái)源:Linux1024 ? 作者:Linux1024 ? 2026-02-24 16:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

瑞芯微(RK)平臺(tái)的嵌入式開發(fā)中,U-Boot作為核心的啟動(dòng)加載程序,負(fù)責(zé)完成鏡像解析、校驗(yàn)、加載等關(guān)鍵流程。而image.c正是U-Boot中處理鏡像(uImage)的核心文件,尤其針對(duì)RK平臺(tái)的SD/NAND/SPI等啟動(dòng)方式做了專屬適配。本文將拆解image.c的核心邏輯,梳理RK平臺(tái)鏡像處理的關(guān)鍵流程,幫助開發(fā)者理解和調(diào)試啟動(dòng)相關(guān)問(wèn)題。

一、文件定位與核心作用

image.c是U-Boot中鏡像管理的核心模塊,主要負(fù)責(zé):

?定義uImage鏡像的屬性枚舉(架構(gòu)、系統(tǒng)、類型、壓縮方式);

?實(shí)現(xiàn)鏡像頭部/數(shù)據(jù)的CRC校驗(yàn),確保鏡像完整性;

?解析多組件鏡像(Multi-File)的子鏡像地址和大?。?/p>

?適配不同平臺(tái)的鏡像加載邏輯(如RK平臺(tái)的專屬鏡像類型);

?格式化輸出鏡像信息(名稱、大小、加載地址等)。

對(duì)于RK平臺(tái)而言,該文件專門定義了rkimage/rksd/rkspi/rknand等專屬鏡像類型,適配RK芯片的SD卡、SPI Flash、NAND Flash等啟動(dòng)介質(zhì)。

二、核心模塊拆解

1.鏡像屬性枚舉:定義RK平臺(tái)專屬類型

文件中通過(guò)4個(gè)核心枚舉表定義了鏡像的關(guān)鍵屬性,其中鏡像類型表(uimage_type)是RK平臺(tái)適配的核心:

staticconsttable_entry_tuimage_type[] = { // ... 其他類型省略  {IH_TYPE_RKIMAGE,  "rkimage",  "Rockchip Boot Image"},  {IH_TYPE_RKSD,   "rksd",   "Rockchip SD Boot Image"},  {IH_TYPE_RKSPI,   "rkspi",   "Rockchip SPI Boot Image"},  {IH_TYPE_RKNAND,  "rknand",  "Rockchip NAND Boot Image"}, // ...};

?rkimage:RK通用啟動(dòng)鏡像;

?rksd:RK SD卡啟動(dòng)鏡像;

?rkspi:RK SPI Flash啟動(dòng)鏡像;

?rknand:RK NAND Flash啟動(dòng)鏡像。

這些類型對(duì)應(yīng)RK芯片(如RK3568/RK3399/RK1808)的不同啟動(dòng)方式,U-Boot會(huì)根據(jù)鏡像類型選擇對(duì)應(yīng)的加載邏輯。

2.鏡像完整性校驗(yàn):CRC校驗(yàn)雙關(guān)卡

RK平臺(tái)啟動(dòng)時(shí),為避免鏡像損壞導(dǎo)致啟動(dòng)失敗,image.c實(shí)現(xiàn)了頭部CRC數(shù)據(jù)CRC兩層校驗(yàn):

(1)頭部CRC校驗(yàn)(image_check_hcrc)

校驗(yàn)鏡像頭部(image_header_t)的完整性,核心邏輯是清空頭部CRC字段后重新計(jì)算CRC32,與原始值對(duì)比:

intimage_check_hcrc(constimage_header_t*hdr){  ulong hcrc;  ulong len =image_get_header_size(); image_header_theader; // 拷貝頭部并清空CRC字段 memmove(&header, (char*)hdr,image_get_header_size()); image_set_hcrc(&header,0); // 重新計(jì)算CRC并對(duì)比  hcrc =crc32(0, (unsignedchar*)&header, len); return(hcrc ==image_get_hcrc(hdr));}

(2)數(shù)據(jù)CRC校驗(yàn)(image_check_dcrc)

校驗(yàn)鏡像數(shù)據(jù)段的完整性,支持大鏡像分塊校驗(yàn)(避免看門狗超時(shí)):

intimage_check_dcrc(constimage_header_t *hdr){ ulongdata = image_get_data(hdr); ulonglen = image_get_data_size(hdr); ulongdcrc = crc32_wd(0, (unsignedchar*)data, len, CHUNKSZ_CRC32); return(dcrc == image_get_dcrc(hdr));}

3.多組件鏡像處理:適配RK多段鏡像加載

RK平臺(tái)部分場(chǎng)景會(huì)使用“多組件鏡像(Multi-File)”(如內(nèi)核+Ramdisk+設(shè)備樹),image.c通過(guò)以下函數(shù)解析子鏡像:

?image_multi_count:統(tǒng)計(jì)多組件鏡像的子鏡像數(shù)量;

?image_multi_getimg:根據(jù)索引獲取子鏡像的加載地址和大小。

核心邏輯示例:

voidimage_multi_getimg(constimage_header_t *hdr,ulongidx,ulong*data,ulong*len){ ulongcount = image_multi_count(hdr);// 獲取子鏡像總數(shù)  uint32_t *size = (uint32_t *)image_get_data(hdr);// 子鏡像大小表地址 ulongimg_data = image_get_data(hdr) + (count +1) *sizeof(uint32_t);// 子鏡像數(shù)據(jù)起始地址 // ... 計(jì)算指定索引子鏡像的偏移和地址}

4. RK平臺(tái)專屬適配點(diǎn)

(1)看門狗適配(memmove_wd)

RK平臺(tái)普遍開啟硬件看門狗,image.c在拷貝鏡像數(shù)據(jù)時(shí),會(huì)分塊喂狗避免復(fù)位:

voidmemmove_wd(void*to,void*from, size_t len,ulongchunksz){#ifdefined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) while(len >0) {    size_t tail = (len > chunksz) ? chunksz : len;    WATCHDOG_RESET();// 喂狗    memmove(to,from, tail);    len -= tail;  }#else  memmove(to,from, len);#endif}

(2)地址配置適配

RK平臺(tái)的鏡像加載地址、內(nèi)存范圍通過(guò)以下函數(shù)適配:

?env_get_bootm_low:獲取鏡像加載的最低地址(默認(rèn)SDRAM基地址);

?env_get_bootm_size:獲取可用內(nèi)存大??;

?load_addr:全局加載地址(可通過(guò)環(huán)境變量loadaddr修改)。

三、RK平臺(tái)鏡像處理完整流程

流程圖(Mermaid語(yǔ)法)

wKgZO2mdZjqAP8hZAAHI3fqZJgM474.png

流程詳解

1.鏡像頭部讀取:從指定地址(如SD卡0x40000地址)讀取image_header_t結(jié)構(gòu)體,包含鏡像魔數(shù)、CRC、加載地址、類型等信息;

2.魔數(shù)校驗(yàn):驗(yàn)證鏡像是否為合法的uImage(RK鏡像需符合uImage格式);

3.頭部CRC校驗(yàn):確保鏡像頭部未被篡改,頭部損壞會(huì)直接終止啟動(dòng);

4.RK鏡像類型判斷:識(shí)別是SD/SPI/NAND類型的RK鏡像,匹配對(duì)應(yīng)加載邏輯;

5.數(shù)據(jù)CRC校驗(yàn):校驗(yàn)鏡像數(shù)據(jù)段完整性,避免因鏡像損壞導(dǎo)致內(nèi)核啟動(dòng)異常;

6.多組件解析(可選):若為Multi類型鏡像,解析內(nèi)核、Ramdisk、設(shè)備樹等子鏡像的地址和大??;

7.鏡像拷貝:分塊拷貝鏡像數(shù)據(jù)到指定加載地址,拷貝過(guò)程中喂看門狗(RK平臺(tái)看門狗超時(shí)默認(rèn)復(fù)位);

8.入口點(diǎn)跳轉(zhuǎn):跳轉(zhuǎn)到鏡像的入口地址(如內(nèi)核入口),完成啟動(dòng)流程。

四、調(diào)試與實(shí)戰(zhàn)要點(diǎn)

1.鏡像信息打印:通過(guò)image_print_contents函數(shù)可輸出鏡像詳細(xì)信息(名稱、類型、加載地址等),RK平臺(tái)調(diào)試時(shí)可開啟該功能定位問(wèn)題;

2.Ramdisk校驗(yàn):image_get_ramdisk函數(shù)專門校驗(yàn)RK平臺(tái)Linux啟動(dòng)的Ramdisk鏡像,需確保Ramdisk的架構(gòu)、類型與內(nèi)核匹配;

3.環(huán)境變量適配:RK平臺(tái)可通過(guò)bootm_low/bootm_size/loadaddr等環(huán)境變量調(diào)整鏡像加載的內(nèi)存范圍,適配不同硬件配置;

4.CRC校驗(yàn)關(guān)閉:調(diào)試階段可臨時(shí)關(guān)閉數(shù)據(jù)CRC校驗(yàn)(注釋image_check_dcrc調(diào)用),快速驗(yàn)證鏡像是否可啟動(dòng)(正式版本必須開啟)。

五、總結(jié)

image.c作為U-Boot鏡像處理的核心文件,為RK平臺(tái)提供了專屬的鏡像類型定義、完整性校驗(yàn)、加載適配等能力。理解其核心邏輯和處理流程,能幫助開發(fā)者快速定位RK平臺(tái)啟動(dòng)過(guò)程中的鏡像損壞、加載地址錯(cuò)誤、看門狗超時(shí)等問(wèn)題。在實(shí)際開發(fā)中,可結(jié)合流程圖和調(diào)試要點(diǎn),高效排查鏡像相關(guān)的啟動(dòng)故障,保障RK平臺(tái)產(chǎn)品的穩(wěn)定性。

若需修改RK平臺(tái)鏡像類型或校驗(yàn)邏輯,建議優(yōu)先修改uimage_type枚舉表和image_check_dcrc/memmove_wd等核心函數(shù),同時(shí)注意適配看門狗和內(nèi)存地址配置,避免引入新的啟動(dòng)問(wèn)題。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • u-boot
    +關(guān)注

    關(guān)注

    0

    文章

    135

    瀏覽量

    39736
  • 瑞芯微
    +關(guān)注

    關(guān)注

    27

    文章

    790

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    玩轉(zhuǎn)U-Boot bdinfo:嵌入式bsp開發(fā)者的定制、擴(kuò)展與裁剪實(shí)戰(zhàn)指南

    作為嵌入式開發(fā)者,U-Boot 是我們調(diào)試、適配板卡的核心工具,而 bdinfo 命令更是板級(jí)信息調(diào)試的“利器”——它能直觀打印內(nèi)存布局、Flash 信息、網(wǎng)絡(luò)配置、時(shí)鐘頻率等核心參數(shù)。但原廠
    的頭像 發(fā)表于 02-24 15:26 ?704次閱讀
    玩轉(zhuǎn)<b class='flag-5'>U-Boot</b> bdinfo:嵌入式bsp開發(fā)者的定制、擴(kuò)展與裁剪實(shí)戰(zhàn)指南

    深入解析RK3588 U-Boot板級(jí)文件:evb_rk3588.c核心邏輯拆解

    在嵌入式開發(fā)領(lǐng)域,瑞芯微RK3588憑借超強(qiáng)的算力、豐富的接口和廣泛的場(chǎng)景適配性,成為高端邊緣計(jì)算、消費(fèi)電子項(xiàng)目的熱門選擇。而U-Boot作為嵌入式系統(tǒng)的“第一道門”,負(fù)責(zé)硬件初始化、引導(dǎo)內(nèi)核啟動(dòng),其板級(jí)適配代碼直接決定了芯片硬件能力的落地。
    的頭像 發(fā)表于 02-24 15:24 ?723次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>RK</b>3588 <b class='flag-5'>U-Boot</b>板級(jí)文件:evb_<b class='flag-5'>rk3588.c</b><b class='flag-5'>核心</b><b class='flag-5'>邏輯</b>拆解

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

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

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

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

    深入解析U-Boot命令處理核心文件:功能、調(diào)試與開發(fā)價(jià)值

    在嵌入式系統(tǒng)開發(fā)中,U-Boot 作為主流的引導(dǎo)加載程序,其命令處理、交互邏輯和自動(dòng)啟動(dòng)流程是核心功能模塊。本文將圍繞command.c、c
    的頭像 發(fā)表于 02-03 15:44 ?868次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b>命令<b class='flag-5'>處理</b><b class='flag-5'>核心</b>文件:功能、調(diào)試與開發(fā)價(jià)值

    深入解析U-Boot核心文件board_f.c:知識(shí)點(diǎn)、調(diào)試要點(diǎn)與開發(fā)價(jià)值

    在嵌入式系統(tǒng)開發(fā)中,U-Boot 作為應(yīng)用最廣泛的引導(dǎo)程序,其底層初始化邏輯直接決定了硬件啟動(dòng)的穩(wěn)定性與可靠性。
    的頭像 發(fā)表于 02-03 15:38 ?738次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b><b class='flag-5'>核心</b>文件board_f.<b class='flag-5'>c</b>:知識(shí)點(diǎn)、調(diào)試要點(diǎn)與開發(fā)價(jià)值

    解析Rockchip平臺(tái)U-Boot核心文件:boot_rkimg.c到底做了什么?

    在嵌入式開發(fā)中,U-Boot 作為引導(dǎo)程序的 “中流砥柱”,負(fù)責(zé)初始化硬件、加載內(nèi)核并啟動(dòng)系統(tǒng)。對(duì)于 Rockchip 平臺(tái)的設(shè)備(如常見的開發(fā)板、智能終端),boot_rkimg.cU
    的頭像 發(fā)表于 02-03 15:29 ?735次閱讀
    <b class='flag-5'>解析</b>Rockchip<b class='flag-5'>平臺(tái)</b><b class='flag-5'>U-Boot</b><b class='flag-5'>核心</b>文件:<b class='flag-5'>boot_rkimg.c</b>到底做了什么?

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

    作為Android設(shè)備啟動(dòng)的第一道“閘門”,Bootloader(以U-Boot為主)承擔(dān)著初始化硬件、加載內(nèi)核、驗(yàn)證鏡像完整性的核心職責(zé)。今天我們拆解Rockchip平臺(tái)
    的頭像 發(fā)表于 01-22 07:06 ?228次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>rk</b><b class='flag-5'>平臺(tái)</b>Android Bootloader<b class='flag-5'>核心</b>代碼:從啟動(dòng)流程到AVB驗(yàn)證

    深入解析RK平臺(tái)Android/Linux Bootloader核心文件:android_bootloader.c

    Bootloader是Android設(shè)備啟動(dòng)的第一道“關(guān)卡”,負(fù)責(zé)初始化硬件、加載系統(tǒng)鏡像并完成內(nèi)核啟動(dòng)的前置準(zhǔn)備。在基于U-Boot的Android設(shè)備中,android_bootloader.c
    的頭像 發(fā)表于 01-09 10:58 ?1186次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>RK</b><b class='flag-5'>平臺(tái)</b>Android/Linux Bootloader<b class='flag-5'>核心</b>文件:android_bootloader.<b class='flag-5'>c</b>

    深入解析?RK?平臺(tái)顯示驅(qū)動(dòng):格式支持、處理流程與實(shí)現(xiàn)原理

    、驅(qū)動(dòng)處理流程、核心實(shí)現(xiàn)原理三個(gè)維度,帶您深入了解? RK? 平臺(tái)顯示驅(qū)動(dòng)的工作機(jī)制。 一、 RK
    的頭像 發(fā)表于 12-02 07:10 ?309次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b>?<b class='flag-5'>RK</b>?<b class='flag-5'>平臺(tái)</b>顯示驅(qū)動(dòng):格式支持、<b class='flag-5'>處理</b>流程與實(shí)現(xiàn)原理

    深入理解?RK3506 U-Boot?重定位:從代碼到原理

    的啟動(dòng)代碼,拆解?RK3506?平臺(tái)?U-Boot?重定位的實(shí)現(xiàn)邏輯、關(guān)鍵步驟與底層原理。 路徑:u-boot/arch/arm/cpu/a
    的頭像 發(fā)表于 11-28 07:05 ?569次閱讀
    <b class='flag-5'>深入</b>理解?<b class='flag-5'>RK</b>3506 <b class='flag-5'>U-Boot</b>?重定位:從代碼到原理

    瑞芯微 RK3588 平臺(tái) Debian 系統(tǒng)開發(fā)案例與使用說(shuō)明

    本文圍繞創(chuàng)龍科技研發(fā)的瑞芯微 RK3588 平臺(tái)評(píng)估板,詳解 Debian 系統(tǒng)使用方法,涵蓋 LinuxSDK 安裝、系統(tǒng)鏡像編譯生成、根文件系統(tǒng)修改、系統(tǒng)文件替換、U-Boot
    的頭像 發(fā)表于 11-05 14:28 ?603次閱讀
    瑞芯微 <b class='flag-5'>RK</b>3588 <b class='flag-5'>平臺(tái)</b> Debian 系統(tǒng)開發(fā)案例與使用說(shuō)明

    U-Boot 無(wú)法識(shí)別 NAND怎么解決?

    U-Boot 無(wú)法識(shí)別 NAND
    發(fā)表于 09-03 06:37

    基于RK3568 + FPGA國(guó)產(chǎn)平臺(tái)的多通道AD實(shí)時(shí)采集顯示方案分享

    在工業(yè)控制與數(shù)據(jù)采集領(lǐng)域,高精度的AD采集和實(shí)時(shí)顯示至關(guān)重要。今天,我們就來(lái)基于瑞芯微RK3568J+FPGA國(guó)產(chǎn)平臺(tái)深入探討以下,它是如何實(shí)現(xiàn)該功能的。適用開發(fā)環(huán)境如下:Windows開發(fā)環(huán)境
    的頭像 發(fā)表于 03-28 10:11 ?1444次閱讀
    基于<b class='flag-5'>RK</b>3568 + FPGA國(guó)產(chǎn)<b class='flag-5'>平臺(tái)</b>的多通道AD實(shí)時(shí)采集顯示方案分享

    U-Boot 和 Bootloader,99% 的工程師都分不清?

    嵌入式軟件工程師聽說(shuō)過(guò) u-boot 和 bootloader,但很多工程師依然不知道他們到底是啥。 ? 今天就來(lái)簡(jiǎn)單講講?u-boot 和 bootloader?的內(nèi)容以及區(qū)別
    的頭像 發(fā)表于 03-25 20:47 ?1775次閱讀