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

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

一、文件定位與核心作用

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

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

?實現鏡像頭部/數據的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會根據鏡像類型選擇對應的加載邏輯。

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

RK平臺啟動時,為避免鏡像損壞導致啟動失敗,image.c實現了頭部CRC數據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)數據CRC校驗(image_check_dcrc)

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

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通過以下函數解析子鏡像:

?image_multi_count:統計多組件鏡像的子鏡像數量;

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

核心邏輯示例:

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

4. RK平臺專屬適配點

(1)看門狗適配(memmove_wd)

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

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

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

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

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

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

流程圖(Mermaid語法)

wKgZO2mdZjqAP8hZAAHI3fqZJgM474.png

流程詳解

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

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

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

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

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

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

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

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

四、調試與實戰要點

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

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

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

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

五、總結

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

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

審核編輯 黃宇

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

    關注

    0

    文章

    135

    瀏覽量

    39747
  • 瑞芯微
    +關注

    關注

    27

    文章

    792

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    玩轉U-Boot bdinfo:嵌入式bsp開發者的定制、擴展與裁剪實戰指南

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

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

    在嵌入式開發領域,瑞芯微RK3588憑借超強的算力、豐富的接口和廣泛的場景適配性,成為高端邊緣計算、消費電子項目的熱門選擇。而U-Boot作為嵌入式系統的“第一道門”,負責硬件初始化、引導內核啟動,其板級適配代碼直接決定了芯片硬件能力的落地。
    的頭像 發表于 02-24 15:24 ?761次閱讀
    <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深度解析:從啟動流程到調試優化

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

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

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

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

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

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

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

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

    在嵌入式開發中,U-Boot 作為引導程序的 “中流砥柱”,負責初始化硬件、加載內核并啟動系統。對于 Rockchip 平臺的設備(如常見的開發板、智能終端),boot_rkimg.cU
    的頭像 發表于 02-03 15:29 ?740次閱讀
    <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平臺
    的頭像 發表于 01-22 07:06 ?249次閱讀
    <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設備啟動的第一道“關卡”,負責初始化硬件、加載系統鏡像并完成內核啟動的前置準備。在基于U-Boot的Android設備中,android_bootloader.c
    的頭像 發表于 01-09 10:58 ?1194次閱讀
    <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?平臺顯示驅動:格式支持、處理流程與實現原理

    、驅動處理流程、核心實現原理三個維度,帶您深入了解? RK? 平臺顯示驅動的工作機制。 一、 RK
    的頭像 發表于 12-02 07:10 ?321次閱讀
    <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>流程與實現原理

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

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

    瑞芯微 RK3588 平臺 Debian 系統開發案例與使用說明

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

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

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

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

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

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

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