4. U-Boot内存读写操作

任务说明

本案例目标是在 QEMU 模拟的 ARM 平台上,通过 U-Boot 的 md、mm、mw 命令对指定内存地址进行读写操作,并验证内存映射的正确性。我们将使用 QEMU 的 virt 机器(内存起始地址 0x40000000),通过串口交互完成操作。

启动 QEMU 与 U-Boot

首先需要准备 U-Boot 的可执行文件。以下命令假设已编译好 u-boot.elf(ARM 64 位 virt 配置):

qemu-system-aarch64 -machine virt -cpu cortex-a53 -m 512M \
  -nographic -bios u-boot.elf

启动后进入 U-Boot 命令行提示符 U-Boot>。

内存读写操作

U-Boot 提供以下内存操作命令:

  • md — 显示内存内容(memory display)
  • mm — 修改内存内容(memory modify,逐地址交互)
  • mw — 写内存内容(memory write,批量填充)

首先使用 md 查看内存映射区域。QEMU virt 机器的 RAM 起始地址为 0x40000000,查看该地址前 16 字节:

U-Boot> md 0x40000000 4
40000000: 00000000 00000000 00000000 00000000    ................

输出显示 4 个 32 位字(共 16 字节),当前内容全为 0(QEMU 启动时 RAM 清零)。

接下来使用 mw 命令向地址 0x40000000 写入一个 32 位值 0xDEADBEEF:

U-Boot> mw.l 0x40000000 0xDEADBEEF

该命令将 0xDEADBEEF 写入指定地址(.l 表示 32 位长字)。

再次使用 md 验证写入结果:

U-Boot> md 0x40000000 4
40000000: deadbeef 00000000 00000000 00000000    ................

可以看到第一个字已变为 deadbeef,验证写入成功。

使用 mm 命令进行交互式修改。该命令会逐个地址提示输入新值,输入 q 退出:

U-Boot> mm.l 0x40000000
40000000: deadbeef ? 0x12345678
40000004: 00000000 ? q

操作过程:mm.l 从 0x40000000 开始,显示当前值 deadbeef,提示输入新值;输入 0x12345678 后自动递增到下一个地址 0x40000004,显示当前值 0,输入 q 退出。

最终验证:

U-Boot> md 0x40000000 4
40000000: 12345678 00000000 00000000 00000000    xV4. ............

内存映射验证

QEMU virt 平台的内存布局可通过 U-Boot 的 bdi 命令查看板级信息,或通过 mtdparts 等命令确认。此处直接验证 RAM 起始地址可读写,且地址 0x40000000 与 QEMU 的物理内存映射一致。若访问未映射地址(如 0x00000000),U-Boot 将返回错误或触发异常:

U-Boot> md 0x00000000 1
md: read error, aborting

该错误信息表明地址 0x0 不在有效内存映射中,从而验证了内存映射的边界。

验证方法与判定标准

  • 写入验证:mw 写入后,md 读回的值与写入值一致,判定内存写入功能正常。
  • 交互修改验证:mm 修改后,md 显示新值,且地址自动递增逻辑正确。
  • 映射验证:RAM 起始地址 0x40000000 可正常读写;访问 0x0 等无效地址时 U-Boot 报错,证明内存映射边界有效。
U-Boot 内存读写操作验证流程 QEMU virt 内存空间 RAM (512MB) 0x40000000 - 0x5FFFFFFF 0x40000000: 0x12345678 (写入后) 0x00000000 (未映射) 访问报错: read error 外设映射区 (UART等) U-Boot 命令操作 md 0x40000000 4 → 显示 4 个字 (16 字节) mw.l 0x40000000 0xDEADBEEF → 写入 32 位值 mm.l 0x40000000 → 交互修改为 0x12345678 md 验证: 0x12345678 ✓ 验证路径: mw 写入 → md 读回 → mm 修改 → md 确认 | 无效地址访问报错验证映射边界

关键要点

  • md 命令格式:md [.b|.w|.l] 地址 [长度],默认以 32 位字显示。
  • mw 命令格式:mw [.b|.w|.l] 地址 值,批量写入固定值。
  • mm 命令格式:mm [.b|.w|.l] 地址,进入交互式逐地址修改模式,输入 q 退出。
  • QEMU virt 平台 RAM 物理地址从 0x40000000 开始,访问未映射地址会触发错误,这是验证内存映射的有效手段。