在瑞芯微(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語法)

流程詳解
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開發者的定制、擴展與裁剪實戰指南
深入解析RK3588 U-Boot板級文件:evb_rk3588.c核心邏輯拆解
U-Boot SPL核心文件spl.c深度解析:從啟動流程到調試優化
深入解析U-Boot TPL代碼:嵌入式啟動的“第一棒”背后的秘密
深入解析U-Boot命令處理核心文件:功能、調試與開發價值
解析Rockchip平臺U-Boot核心文件:boot_rkimg.c到底做了什么?
深入解析rk平臺Android Bootloader核心代碼:從啟動流程到AVB驗證
深入解析RK平臺Android/Linux Bootloader核心文件:android_bootloader.c
深入理解?RK3506 U-Boot?重定位:從代碼到原理
瑞芯微 RK3588 平臺 Debian 系統開發案例與使用說明
基于RK3568 + FPGA國產平臺的多通道AD實時采集顯示方案分享
深入解析U-Boot image.c:RK平臺鏡像處理核心邏輯
評論