jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000a0000: 0x3030 instead 问题分析

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/li_wen01/article/details/84671052

    嵌入式设备中,如果系统打印出很多类似这样的的消息:jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000a0000: 0x3030 instead 可以确认的是系统在挂载jffs文件系统的时候出错了。我有遇到出多次,总体分为两类:

    (1)调整分区表之后出现这样的情况,或是更换文件系统的时候出现这样的情况。

    (2)给工厂制作的flash烧片文件,有些设备出现:jffs2_scan_eraseblock() 这样的错误。


问题现象:

    出现这样的问题,问题现象一般就是jffs文件系统挂载不上,同时打印很多类似下面的消息:

[    3.202239] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00090000: 0x3030 instead
[    3.211739] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00090004: 0x3030 instead
[    3.221219] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00090008: 0x3030 instead
[    3.230710] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0009000c: 0x3030 instead
[    3.240207] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00090010: 0x3030 instead
[    3.249702] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00090014: 0x3030 instead
[    3.259180] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00090018: 0x3030 instead
[    3.268674] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x0009001c: 0x3030 instead
[    3.278153] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00090020: 0x3030 instead
[    3.287645] jffs2: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x00090024: 0x3030 instead
[    3.297118] jffs2: Further such events for this erase block will not be printed

问题原因:

    (1)出现类似的情况,首先要确认自己制作的jffs2文件系统是否有问题,也就是制作时候测参数是否正确,比如:

hisilicon$mkfs.jffs2 –d ./rootbox -l –e 0x20000 -o jffs2-root.img

    注意参数-d 表示文件系统所在的目录,-l 表示小端模式,-e 0x20000 表示flash块大小。这里特别需要注意大小端模式和flash块大小一定要跟设备匹配。如果制作的文件系统不对,那自然就会挂载不上。

    (2)重新分区之后或是更换文件系统类型之后出现这样的问题。这种问题一般是应为需要挂载的分区有赃数据块。这个时候可以尝试将需要挂载的分区重新擦除一遍在挂载应该就不会有出问题了。

    (3)工厂用于烧入flash的烧片,烧入flash之后出现这样的情况。这种情况多数是因为烧片空余的数据填错了。需要挂载为jffs类型文件系统的分区,如果没有文件,我们需要填充填充0xFF,如果填充其它的值也会出现上面的这种问题。

    比如有下面分区:

mtdparts=hi_sfc:1M(boot),4M(kernel),8M(rootfs),4M(app&data),4M(data),2M(parameter),8M(updatefs)

   我们实际有文件的是boot,kernel,rootfs 和应用程序app。在实际应用的时候,我们经常也将data(数据区),parameter(参数区),updatefs(升级区)也使用jffs文件系统类型挂载到某个目录上去。这所有的分区大小是32M,假如我们有一个32M大小的flash,我们给工厂的烧片并不是所有的地址都是有用的数据。比如应用文件分区4M,实际我们应用程序肯定是需要小于4M的,否则也会出现其他的问题。假如app实际大小为3.5M,那么还有0.5M的空间,我们就需要填写0xFF,不然就会出现问题。

原因分析:

    jffs的全称是Journalling Flash FileSystem,它是一种日志式文件系统。jffs2文件系统在挂载的时候,它会去扫描整个jffs2文件系统,如果发现有赃数据它就会报错。另外jffs2文件系统由于日志文件的过度开销和用于回收系统的无用存储单元,它会占用一小段空间,因为垃圾收集的原因,当jffs2文件系统中的文件满了或是接近满了的时候,它的运行速度会迅速的降低。

    flash在写入数据之前都会进行一个数据擦除的动作,也就是说要写入数据,先要擦除。对于烧片文件,空白地址填0xff就是因为flash擦除后的状态就是0xff,也就是保存flash空白地址空间是擦除状态。如果填其他的数据,jffs2文件系统可能认为是赃数据,最终就导致了出现前面上面的问题。

猜你喜欢

转载自blog.csdn.net/li_wen01/article/details/84671052
今日推荐