如何对MMC设备中指定扇区间的数据计算校验和(针对引导分区前的扇区)
如何对MMC设备中指定扇区间的数据计算校验和(针对引导分区前的扇区)
嗨,我来帮你搞定这个MMC设备指定扇区校验和的问题!首先先明确你的需求:要对BOOT分区(从扇区6144开始)之前的所有扇区计算校验和,先把你给出的分区信息整理成清晰的表格:
自定义分区区域表
| Area Name | Size | From (sector #) | To (Sector #) |
|---|---|---|---|
| SPL | 512kB | 64 | 1077 |
| U-Boot | 2MB | 2048 | 6143 |
| BOOT | 256MB | 6144 | 530431 |
| rootfs | - | 530432 | - |
fdisk 查看的分区表
| Device | Boot | Start | End | Sectors | Size | Id | Type |
|---|---|---|---|---|---|---|---|
| /dev/mmcblk0p1 | 6144 | 530431 | 524288 | 256M | 83 | Linux | |
| /dev/mmcblk0p2 | 530432 | - | - | - | - | - |
接下来给你两种常见的校验和计算方式,一种是直接计算所有引导分区前的扇区,另一种是单独计算SPL、U-Boot这类特定区块:
方式一:计算BOOT分区前的全部扇区(0~6143扇区)
默认MMC设备的扇区大小是512字节,我们可以用dd命令读取指定范围的扇区数据,再配合校验和工具(比如md5sum、sha256sum、crc32)直接计算,无需生成临时文件:
用MD5计算校验和
sudo dd if=/dev/mmcblk0 bs=512 count=6144 | md5sum
用SHA256计算校验和
sudo dd if=/dev/mmcblk0 bs=512 count=6144 | sha256sum
用CRC32计算校验和
如果你的系统有crc32命令(嵌入式系统或安装libarchive-zip-perl包后可用):
sudo dd if=/dev/mmcblk0 bs=512 count=6144 | crc32
注意:如果你的MMC设备扇区大小不是512字节,可以用
fdisk -l /dev/mmcblk0查看扇区大小,然后把bs参数改成对应值,同时调整count:比如扇区是4096字节,那么count=6144/8=768,命令就变成sudo dd if=/dev/mmcblk0 bs=4096 count=768 | md5sum
方式二:单独计算特定区块(比如SPL或U-Boot)
如果你只需要对SPL、U-Boot这类单独区域计算校验和,可以用skip参数跳过前面的扇区,再用count指定读取的扇区数:
计算SPL区域(64~1077扇区)
# 计算扇区数:1077-64+1=1014 sudo dd if=/dev/mmcblk0 bs=512 skip=64 count=1014 | md5sum
计算U-Boot区域(2048~6143扇区)
# 计算扇区数:6143-2048+1=4096 sudo dd if=/dev/mmcblk0 bs=512 skip=2048 count=4096 | md5sum
小提示
- 所有操作需要root权限,所以命令前要加
sudo - 如果担心误操作,可以先把扇区数据导出到临时文件备份,再计算校验和:比如
sudo dd if=/dev/mmcblk0 of=/tmp/pre_boot_backup.bin bs=512 count=6144,然后对这个备份文件计算校验和 - 校验和可以用来验证这些引导区域的数据是否被篡改,或者在烧写后确认数据正确性
备注:内容来源于stack exchange,提问作者foxtrot22
相关产品推荐
相关产品推荐

