jffs2_scan_eraseblock(): Magic和Empty Flash at...解决办法!

本文介绍了解决Linux下JFFS2根文件系统出现的Emptyflash及Magic警告问题的过程。通过调整生成文件大小并正确设置擦除块大小,成功避免了内存脏数据填充到文件系统剩余页部分。
AI助手已提取文章相关产品:

这段时间因为工作上的需要,一直在弄Linux下的JFFS2根文件系统,前期老是出现Empty flash at 0x0012cdff - 0x0012ffff以及jffs2_scan_eraseblock(): Magic.....这样一大堆的警告,虽然不影响linux系统的运行,但是多少对于linux系统来说,还不是很安全的啦,毕竟老是在擦除不该擦除的地址,因为这些地方对应的是linux的内核代码处,总感觉不是很完美的解决问题,因此在网络上也GOOGLE了一下,有很多人都遇到这样的问题,也看到很多人写了关于这样问题的解决办法,可是按照网路上的方法,始终无法解决这类现象,后来,没有办法,只有自己仔细看了一下MTD的详细介绍和分析了相关代码,最后修改两处地方,才将问题解决。

主要还是讲讲JFFS2文件系统的制作以及一些细节吧:mkfs.jffs2

在开发板中采用cat proc/mtd 查看erasesize大小为0x10000,而我制作JFFS文件时,也是选中0x10000的啊,因此可以知道不是这里的问题,最后,看了一下生成的JFFS2的文件大小为1.200M,心里想好奇怪的文件大小哦。最后自己算了一下:1.2x1024x1024=1258291.2=0x133333,最后重新生成JFFS2文件时,设置了一下:--pad=0x133333,再来查看JFFS2的文件大小问1.218M。不一样的哦。这就说明,很可能是将内存脏数据填充到文件系统剩余页部分。而出现了jffs2_scan_eraseblock(): Magic和Empty Flash at...问题,之后烧录到系统中,启动很快,再也看不见这两个错误了。问题完美解决了。

mkfs.jffs2 -n -s 512 -e 64KiB--pad=0x133333 -d rootfs -o myjffs2.img
参数注释:
        -s  页大小,采用默认的设置也可。
        -e  擦除块大小,需和手册相匹配,此处为128(由手册可知),1 Block = (2K + 64)B + 64 Pages=(128K + 4K)bytes
            此处如果设置过大(如 256),将出现jffs2_scan_eraseblock():Magic bitmask......问题
            如果设置过小(如 64),将出现Empth flash at .......问题 
     --pad 设置生成文件大小,其实此处也不算是设置,因为此选项是填充的意思,当生成文件比参数规定大小大时,此选项不起作用只有当生成文件小于规定大小才会进行填充,如果生成的文件大小不规范,很可能将内存脏数据填充到文件系统剩余页部分。

您可能感兴趣的与本文相关内容

<think>好的,用户遇到了JFFS2文件系统中的magic bitmask错误,提示是“jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x000a0000: 0x3030 instead”。我需要根据提供的引用内容来整理解决方案。 首先,引用[1]提到这种情况通常是在挂载JFFS2文件系统时出错,可能分为两类问题。引用[2]指出可能的原因包括硬件故障如坏块,或者文件系统损坏。引用[3]的例子显示分区配置可能有问题,比如挂载了未正确格式化的分区。引用[4]则提到了编译选项中的SPI-NOR设置可能需要调整。 接下来,我需要将这些信息整合成步骤清晰的解决方案。首先检查硬件是否存在坏块,使用工具如mtd-utils中的flash_erasenandtest。然后验证文件系统是否正确创建,可能需要重新制作。检查分区配置是否正确,确保挂载的分区与实际格式一致。调整内核配置,特别是SPI-NOR的擦除扇区大小设置。最后,考虑日志干扰,可能需要在启动时关闭控制台输出或检查内核日志。 用户可能需要逐步排查,所以步骤要分优先级,从简单到复杂。同时,相关问题部分可以引导用户进一步处理硬件问题或配置调整,确保覆盖所有可能的原因。</think>### JFFS2文件系统Magic bitmask错误解决方案 当嵌入式系统出现$jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found$错误时,说明JFFS2文件系统在挂载时无法识别有效的文件系统结构[^1]。以下是分步骤排查与解决方案: --- #### 1. **检查硬件故障** - **检测Flash坏块** 使用`mtd-utils`工具包中的`flash_erase`或`nandtest`命令扫描指定MTD分区: ```bash flash_erase --jffs2 /dev/mtd4 0 0 # 针对mtdblock4分区 nandtest -p 3 /dev/mtd4 # 检测坏块并标记 ``` 若出现连续坏块,需考虑更换Flash芯片[^2]。 - **验证电压与焊接** 使用示波器检测Flash芯片供电电压是否稳定,并检查PCB焊接点是否虚焊。 --- #### 2. **验证文件系统完整性** - **重新创建JFFS2镜像** 使用`mkfs.jffs2`工具生成新镜像时,需指定正确的擦除块大小(例如4KB): ```bash mkfs.jffs2 -e 0x1000 -n -d /rootfs_dir -o rootfs.jffs2 ``` 参数`-e`需与Flash芯片规格完全匹配[^3]。 - **对比原始镜像与烧录内容** 通过`md5sum`验证烧录前后的镜像一致性: ```bash md5sum rootfs.jffs2 # 原始镜像 md5sum /dev/mtdblock4 # 烧录后内容 ``` --- #### 3. **调整内核配置** - **修改SPI-NOR擦除模式** 在Linux内核配置中取消`Use small 4096 B erase sectors`选项: ``` Device Drivers → Memory Technology Device (MTD) support → SPI-NOR device support ``` 该设置错误会导致JFFS2扫描时出现地址偏移[^4]。 --- #### 4. **检查分区挂载配置** - **验证MTD分区表** 对比设备树(DTS)中的分区定义与实际Flash容量: ```dts partitions { partition@0 { reg = <0x00000000 0x000C0000>; label = "boot"; }; partition@1 { reg = <0x000C0000 0x00020000>; label = "env"; }; // 确保rootfs分区地址无重叠 }; ``` - **临时屏蔽问题分区** 在启动参数中移除对`custfs`等非必要分区的挂载,观察错误是否消失。 --- #### 5. **日志干扰排除** - **禁用控制台输出** 在系统启动脚本中添加`loglevel=0`参数,减少内核打印干扰: ```bash setenv bootargs console=ttyS0,115200 loglevel=0 ``` - **通过dmesg过滤日志** 使用`dmesg -w | grep -v "Magic bitmask"`动态过滤无关错误信息。 --- ####
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值