jffs2_scan_eraseblock():magic bitmask xxx not found at xxx

接上篇文章,在我的bootm地址设置正确后内核已经可以正确启动,在kernel启动信息中看到bootargs传过来的参数接收正确,分区信息也符合预期

但是在内核加载完成之后,在挂载rootfs又出现问题:jffs2_scan_eraseblock():magic bitmask xxx not found at xxx

现象描述:大概意思就是说文件系统中的某些擦除块(erase block)存在损坏或无法读取的情况,问题原因:我在将rootfs写入到flash的时候,没有将整个rootfs所在的分区擦除,而是只擦除了下载的rootfs文件的大小。我当时用的这条命令tftp 0x80060000 ${dir}ap143${bc}-jffs2&&erase 0x9f070000 +$filesize&&cp.b $fileaddr 0x9f070000 $filesize,意思是先通过tftp从服务器下载文件,在下载完成之后他会计算文件的大小,并将文件的大小保存在$filesize这个环境变量中,然后擦除从这个分区地址开始  往后的实际文件大小的地址空间长度,而不是擦除整个分区(如下图示例,我下载的实际uboot文件大小为168K,我给uboot设置的分区大小为256K,按照一个扇区64k字节大小,如果擦除整个分区的话,应该要擦除4个sector,下面图中应该显示为First 0x0 last 0x3才对,但是他的结果为First 0x0 last 0x2,这就是因为我当时把擦除面积设置为了实际文件大小,我的文件大小为168K,3*64=192 > 168,所以系统默认只擦除3个sector给我存放uboot.bin),因为实际下载的文件大小肯定是比我们给他划分的分区要小的,所以导致后面一部分没有被擦除,里面是脏数据,所以导致上面图中的情况。解决办法是将这条命令改为tftp 0x80060000 ${dir}ap143${bc}-jffs2&&erase 0x9f230000 +0xdb0000&&cp.b $fileaddr 0x9f230000 $filesize,其中0xdb0000就是给rootfs分区分配的大小,我的是12800KB。重新用这条命令下载,擦除和写入,就可以解决上面图中的问题了

当然这并不是唯一的原因,当出现jffs2_scan_eraseblock():magic bitmask xxx not found at xxx这种问题是,也有可能是因为flash硬件本身的故障,可能刚好你rootfs分区的那段地址空间出现了坏块的情况,也可能是你的rootfs文件系统本身有损坏。需要多方面排查,我这里只提供了一种可能的解决思路

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值