如何读取某些从 NAND 引导的设备上的 U-boot (或者其他 bootloader )

http://projects.doozan.com/uboot/build_uboot.htm 上看到的。U-boot 和 U-boot env 所在的 block 往往没有 ECC (反正 NAND 的前几个 boot block 是保证无坏块的,任何 FTL 控制器的固件都得写在这儿,有 ECC 也是白搭),直接读取会表现得和坏块一样。

所以,正确的姿势是(或者可以试一下):

nanddump -nof u-boot.img /dev/mtdX

当然 X 一般是 0 了。-n 关掉 ECC 校验,-o 关掉 OOB ( Out-of-band ,即 NAND 每块比整数大小多出来的空间),-f 输出到文件。

附带不用编程器备份编程器固件大法:

ssh user@target dd if=/dev/mtdblockX conv=sync,noerror > mtdX.img

X 从 0 到最后一个 part ,完事后 cat 起来即可。当然如前所述 bootloader 有可能需要单独处理。-conv sync,noerror 适用于 NAND ,可以跳过坏块并填 0 。当然,此选项有的 busybox 自带的 dd 不支持,于是得先 scp 上去一个。scp 不支持直接读取块设备或者容错,cp 到 tmpfs 内存又可能不够,遂出此策。

话说回来,由于 NAND 存在位置不确定的坏块,所以单独备份 U-boot 的意义比较大。

如果要窥探 NAND 镜像的内容,你可能需要 nandsem 内核模块:

modprobe nandsim cache_file=some_image_dupe.img # 养成备份好习惯

然后你的电脑上就会多出来一个新的 mtd 设备,这样像 ubifs 之类的东西就可以拿出来用了。


PS. 来美一年采坑颇多,等有心情了自会慢慢吐槽。

《如何读取某些从 NAND 引导的设备上的 U-boot (或者其他 bootloader )》有2个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注