一、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
命令