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