免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2650 | 回复: 0

jffs2在kernel和uboot中实现的不同 [复制链接]

论坛徽章:
0
发表于 2011-09-18 09:39 |显示全部楼层
上周在弄upgrade的接口设计及实现,接口倒还好,实现也不难。但到最后调试时出现了在kernel中通过mount /dev/mtdblock1的方式进行文件读写操作,写完后重启进入uboot,结果报CRC错误,分析读取的数据,发现部份数据还是上次改之前的。而重新进入linux,文件却还是正确的。

我想应该是uboot中jffs2实现的问题,但修改uboot影响会比较大,不好操作。所以一直在kernel里面想办法。

周五分析了jffs2的实现,看到jffs2中利用了日志功能,以保护数据的有效性。但这个有效性,并不是保证新写入的数据不会丢失,而是保证在新数据没有写入完成之前,原有数据不被破坏。是不是可能因为这个原因引起的呢?

于是修改升级代码,unlink掉升级文件,重新creat。重启后,数据果然正常了,bug没有了。

原来,jffs2的日志功能只有在修改文件的时候才会生效,即修改文件之前先在freelist上查找空闲块,写入新的数据。并且因为考虑到损耗平衡,会搬移原来的数据。而且,jffs2的垃圾回收机制也是在后台运行,写文件结束不代表回收完成。日志功能保证只有在所有操作都完成之后,才会将inode指向新的数据。kernel对这些功能都是支持的,但uboot实现的只是jffs2的一部份功能,读取这样的数据时就出现问题了。而新创建的文件,就不会有日志功能的保护,只需要查找空闲块,写入数据就可以了。这样,uboot就可以正确读取了。

看来,就一个简单的文件读取操作,也会涉及到文件系统的理解,这个,操作系统各个模块之间的影响,还真的是很大,全面理解是必须的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP