一、mkimage 命令參數詳解
在 RISC-V Linux 環境下,使用 U-Boot 的 mkimage
工具生成 uImage 的基本命令格式如下:
mkimage -A riscv -O linux -T kernel -C compression -a load_addr -e entry_addr -n "描述信息" -d Image uImage
核心參數說明:
參數 | 必選 | 說明 | RISC-V 典型值 |
---|---|---|---|
-A arch | ? | 指定架構 | riscv |
-O os | ? | 操作系統類型 | linux |
-T type | ? | 鏡像類型 | kernel (內核鏡像) |
-C comp | 壓縮格式 | none (未壓縮)gzip (gzip壓縮) | |
-a addr | ? | 加載地址 U-Boot 拷貝內核到內存的位置 | ` |
0x80200000` | |||
-e addr | ? | 入口地址 內核執行的起始地址 | 通常與?-a ?相同 |
-n text | 鏡像描述文本 | "RISC-V Linux-6.8.0" | |
-d in_file | ? | 輸入文件(原始 Image) | arch/riscv/boot/Image |
輸出文件 | ? | 生成的 uImage 文件名 | uImage |
RISC-V 示例命令:
mkimage -A riscv -O linux -T kernel -C none \-a 0x80200000 -e 0x80200000 \-n "RISC-V Linux Kernel" \-d arch/riscv/boot/Image uImage
二、uImage vs Image 關鍵區別
特性 | uImage | 原始 Image |
---|---|---|
文件結構 | 添加?64字節 U-Boot 頭 (魔數/CRC/地址/時間戳) | 純內核二進制 |
引導方式 | U-Boot 直接通過?bootm ?加載 | 需手動指定地址 配合? booti ?命令 |
加載地址 | 頭部自動指定 (-a ?參數) | 需手動在 U-Boot 設置 |
校驗機制 | 頭部含 CRC32 校驗1 | 無校驗 |
RISC-V 支持 | ? 完整支持 | ? 但需額外配置 |
文件大小 | Image + 64 字節 | 原始大小 |
適用場景 | U-Boot 傳統引導 | U-Boot 的?booti UEFI/GRUB 引導 |
三、RISC-V 環境下的特殊說明
-
地址對齊要求:
-
RISC-V 內核加載地址必須 2MB 對齊(如
0x80200000
) -
入口地址通常與加載地址相同
-
-
設備樹配合:
# 啟動命令示例 => setenv bootargs 'console=ttyS0,115200' => load mmc 0:1 0x83000000 uImage # 加載內核 => load mmc 0:1 0x88000000 dtb.img # 加載設備樹 => bootm 0x83000000 - 0x88000000 # 啟動內核
-
調試技巧:
-
查看 uImage 頭部信息:
mkimage -l uImage
-
錯誤排查:
-
Bad Magic Number
→ 頭部損壞或非 uImage -
Invalid Entry Point
→-e
地址設置錯誤
-
-
四、典型工作流程
graph LRA[編譯內核] --> B(生成原始 Image)B --> C[mkimage 添加頭部]C --> D(uImage)D --> E[U-Boot 加載]E --> F{bootm 啟動}F -->|成功| G[進入 Linux]F -->|失敗| H[檢查加載地址/設備樹]
常見問題解答
Q: 為什么 RISC-V 常用 0x80200000
作為加載地址?
A: 這是 QEMU 和多數 RISC-V 開發板的默認設計:
-
0x80000000
→ U-Boot 加載地址 -
0x80200000
→ 內核加載地址(保留 2MB 空間)
Q: 能否直接引導原始 Image 文件?
A: 可以,但需使用 U-Boot 的 booti
命令