某块单板在linux内核启动过程中出现异常,定位下来是访问/dev/console时出现错误,最后出错在fs/squashfs/lzma_wrapper.c->unlzma()函数。
该单板的rootfs为squashfs,而flash是NAND芯片。
定位思路:
将squashfs_fs.h pr_xx改为printk,这样对squashfs的访问都可以打印出来。
#define TRACE(s, args...) pr_debug("SQUASHFS: "s, ## args)
#define ERROR(s, args...) pr_err("SQUASHFS error: "s, ## args)
#define WARNING(s, args...) pr_warning("SQUASHFS: "s, ## args)
根据打印的信息,了解从NAND flash读出的数据解压出错,于是将解压前的数据打印出来,和烧flash的文件做对比,发现3k的数据里面有一个byte有错误。因此怀疑芯片厂商的NAND驱动有bug。和芯片厂商联系后,他们确认booter和kernel的NAND的ECC算法是不一致的,发来了新的booter,重烧bin文件,解决。
阅读(2929) | 评论(0) | 转发(0) |