如何在U-Boot中使用CMP命令比较内存地址及排查匹配异常
U-Boot CMP命令验证镜像一致性的问题排查与正确方法
问题场景
尝试用U-Boot的CMP命令验证MTD分区/dev/mtd2与MMC分区中的u-boot-swap.bin是否一致,操作步骤如下:
- 读取MTD分区内容到内存:
=> sf read 0x81000000 0x40000 0xc0000 device 0 offset 0x40000, size 0xc0000 SF: 786432 bytes @ 0x40000 Read: OK
- 读取MMC分区中的文件到内存:
=> ext4load mmc 0:2 0x82000000 /boot/u-boot-swap.bin 445512 bytes read in 144 ms (2.9 MiB/s)
执行CMP命令比较时出现不匹配:
=> cmp 0x81000000 0x82000000 445512 word at 0x8105c7dc (0x76203033) != word at 0x8205c7dc (0x76203130) Total of 94711 word(s) were the same => cmp 0x81000000 0x82000000 786432 word at 0x8105c7dc (0x76203033) != word at 0x8205c7dc (0x76203130) Total of 94711 word(s) were the same
存在的问题
- 镜像大小不匹配:从SPI Flash读取的内容是786432字节,而MMC中的
u-boot-swap.bin仅445512字节,两个文件本身大小就不一致,必然会出现比较不匹配。 - MTD分区读取范围错误:读取
/dev/mtd2时使用的偏移0x40000和大小0xc0000可能并非u-boot-swap.bin在该分区的实际存储范围,导致读取了多余的无关数据。 - CMP长度参数逻辑混乱:两次比较分别使用了MMC文件大小和SPI Flash读取大小,但由于源内容本身大小不同,无论用哪个长度,都会出现不匹配的情况。
正确的验证方法
步骤1:确认镜像的实际大小与存储位置
- 先查看MMC分区中
u-boot-swap.bin的准确大小:
=> ext4ls mmc 0:2 /boot/
- 查看MTD分区的详细信息,确认
/dev/mtd2中u-boot-swap.bin的实际起始偏移和大小:
=> mtd list
步骤2:准确读取镜像到内存
- 从SPI Flash读取
u-boot-swap.bin的完整内容到内存(使用步骤1确认的偏移和大小):
=> sf read 0x81000000 <实际偏移> <实际大小>
- 从MMC读取完整的
u-boot-swap.bin到内存:
=> ext4load mmc 0:2 0x82000000 /boot/u-boot-swap.bin
此时终端会显示读取的字节数,记下来这个数值(比如445512)。
步骤3:执行CMP命令比较
使用MMC读取的字节数作为比较长度,确保比较的是两个镜像的完整且相同长度的内容:
=> cmp 0x81000000 0x82000000 <MMC读取的字节数>
备选方案:MD5校验(更准确)
如果U-Boot支持md5sum命令,可通过计算MD5值来验证一致性:
- 计算SPI Flash读取内容的MD5:
=> md5sum 0x81000000 <镜像大小>
- 计算MMC读取内容的MD5:
=> md5sum 0x82000000 <镜像大小>
若两个MD5值完全一致,则说明镜像内容相同。
内容的提问来源于stack exchange,提问作者vishnumotghare
相关产品推荐
相关产品推荐

