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

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

一、文件定位與核心作用

image.c是U-Boot中鏡像管理的核心模塊,主要負責:

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

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

?解析多組件鏡像(Multi-File)的子鏡像地址和大??;

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

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

對于RK平臺而言,該文件專門定義了rkimage/rksd/rkspi/rknand等專屬鏡像類型,適配RK芯片的SD卡、SPI Flash、NAND Flash等啟動介質。

二、核心模塊拆解

1.鏡像屬性枚舉:定義RK平臺專屬類型

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

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通用啟動鏡像;

?rksd:RK SD卡啟動鏡像;

?rkspi:RK SPI Flash啟動鏡像;

?rknand:RK NAND Flash啟動鏡像。

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

2.鏡像完整性校驗:CRC校驗雙關卡

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

(1)頭部CRC校驗(image_check_hcrc)

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

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); // 重新計算CRC并對比  hcrc =crc32(0, (unsignedchar*)&header, len); return(hcrc ==image_get_hcrc(hdr));}

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

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

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平臺部分場景會使用“多組件鏡像(Multi-File)”(如內核+Ramdisk+設備樹),image.c通過以下函數(shù)解析子鏡像:

?image_multi_count:統(tǒng)計多組件鏡像的子鏡像數(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ù)起始地址 // ... 計算指定索引子鏡像的偏移和地址}

4. RK平臺專屬適配點

(1)看門狗適配(memmove_wd)

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

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平臺的鏡像加載地址、內存范圍通過以下函數(shù)適配:

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

?env_get_bootm_size:獲取可用內存大小;

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

三、RK平臺鏡像處理完整流程

流程圖(Mermaid語法)

wKgZO2mdZjqAP8hZAAHI3fqZJgM474.png

流程詳解

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

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

3.頭部CRC校驗:確保鏡像頭部未被篡改,頭部損壞會直接終止啟動;

4.RK鏡像類型判斷:識別是SD/SPI/NAND類型的RK鏡像,匹配對應加載邏輯;

5.數(shù)據(jù)CRC校驗:校驗鏡像數(shù)據(jù)段完整性,避免因鏡像損壞導致內核啟動異常;

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

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

8.入口點跳轉:跳轉到鏡像的入口地址(如內核入口),完成啟動流程。

四、調試與實戰(zhàn)要點

1.鏡像信息打印:通過image_print_contents函數(shù)可輸出鏡像詳細信息(名稱、類型、加載地址等),RK平臺調試時可開啟該功能定位問題;

2.Ramdisk校驗:image_get_ramdisk函數(shù)專門校驗RK平臺Linux啟動的Ramdisk鏡像,需確保Ramdisk的架構、類型與內核匹配;

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

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

五、總結

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

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

審核編輯 黃宇

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

    關注

    0

    文章

    135

    瀏覽量

    39738
  • 瑞芯微
    +關注

    關注

    27

    文章

    790

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

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

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

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

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

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

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

    在嵌入式系統(tǒng)開發(fā)中,U-Boot 作為主流的引導加載程序,其命令處理、交互邏輯和自動啟動流程是核心功能模塊。本文將圍繞command.c、c
    的頭像 發(fā)表于 02-03 15:44 ?871次閱讀
    <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>文件:功能、調試與開發(fā)價值

    深入解析U-Boot核心文件board_f.c:知識點、調試要點與開發(fā)價值

    在嵌入式系統(tǒng)開發(fā)中,U-Boot 作為應用最廣泛的引導程序,其底層初始化邏輯直接決定了硬件啟動的穩(wěn)定性與可靠性。
    的頭像 發(fā)表于 02-03 15:38 ?739次閱讀
    <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>:知識點、調試要點與開發(fā)價值

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

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

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

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

    深入解析RK平臺Android/Linux Bootloader核心文件:android_bootloader.c

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

    深入解析?RK?平臺顯示驅動:格式支持、處理流程與實現(xiàn)原理

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

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

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

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

    本文圍繞創(chuàng)龍科技研發(fā)的瑞芯微 RK3588 平臺評估板,詳解 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'>平臺</b> Debian 系統(tǒng)開發(fā)案例與使用說明

    U-Boot 無法識別 NAND怎么解決?

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

    基于RK3568 + FPGA國產平臺的多通道AD實時采集顯示方案分享

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

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

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