关于jffs2文件系统如何掉电保护

JFFS2 是将节点信息保存在内存中

 

Flash上日志型文件系统的资料,了解到传统的基于闪存转换层(FLT)的文件系统存在的主要问题:
1. 效率低。因为每次都要把要修改的数据所在擦写块放入内存,产生了许多不必要的读操作;写入时,要将原来的擦写块擦除,然后再将内存中修改的数据写入该擦写块。这样就造成了数据带宽的严重浪费。
2. 降低了Flash的寿命。因为有大量无用的擦写动作,使得许多不需要擦除的块被擦除重写,这导致了整个Flash使用寿命的降低。
3. 没有提供磨损平衡,也会降低Flash的寿命。因为只要一个擦写块坏了,整块Flash也就不能用了,而那些频繁修改的块将会比其它块更快地成为坏块。
4. 不安全。如果在擦写过程中突然 掉电 ,那么整个擦写块的数据将可能丢失。

日志型文件系统(LogFS)就是为解决以上问题而产生的,它将对文件的修改描述成日志,从而减少对Flash的擦写。只有当擦写请求超过一个擦写块的边界时,文件系统才会对Flash进行擦写。这种更新方式也叫out-of-place。
JFFS2 就是Flash上应用最广的一个日志结构的文件系统。它提供的垃圾回收机制,使得我们不需要马上对擦写越界的块进行擦写,而只需要将其设置一个标志,标明为脏块。当可用的块数不足时,垃圾回收机制才开始回收这些节点。同时,由于JFFS2 基于日志结构,在意外掉电 后仍然可以保持数据的完整性,而不会丢失数据。

然而,JFFS2 仍然有其缺点,这也是人们提出JFFS3的原因。
因为挂载时需要扫描整块Flash,来确定节点的合法性以及建立必要的数据结构,这使得JFFS2 挂载时间比较长。
又由于JFFS2 是将节点信息保存在内存中的,使得它所占用的内存量和节点数目成正比。
另外,由于JFFS2 是通过随机方式来实现磨损平衡的,它不能保证磨损平衡的确定性。

 

 

 

日志式文件系统在强调数据完整性的企业级服务器中有着重要的需求,是文件系统发展的方向。日志式文件系统的思想来自于如Oracle等大型数据库。数据库操作往往是由多个相关的、相互依赖的子操作组成,任何一个子操作的失败都意味着整个操作的无效性,对数据库数据的任何修改都要回复到操作以前的状态。日志式文件系统采用了类似的技术。  

  在分区中保存有一个日志记录文件,文件系统写操作首先是对记录文件进行操作,若整个写操作由于某种原因(如系统掉电)而中断,则在下次系统启动时就会读日志记录文件的内容来恢复没有完成的写操作。而这个过程一般只需要几秒钟到几分钟,而不是ext2文件系统的fsck那样在大型服务器情况下可能需要几个小时来完成扫描。 


我所说的 损坏的数据并不是指 flash 上的坏块, jiffs 是有坏块管理的,或者说它能够避开坏块,不去使用坏块。
所谓的坏块,其实就是不能完全擦除干净的块,其实还是能写入数据的。
所谓损坏的数据, 比如你现在的情况, 刚擦除,还没写入就掉电了, 这种就算是了。
另外还有一些,比如硬件不够稳定,导致写入的数据不完整, 或者驱动写得不够健壮,
都有可能引起数据不完整的情况出现, 而这些数据就是 jiffs 不认可的数据,但是 flash 硬件并没有问题,
或者说这个块并不是坏块。



是不是如果一个分区里只要有一个坏block,jffs2就mount不上呢?如果不是这样的话,那么导致
===========================================
坏的数据可能导致 jiffs2 mount 不起来, 但是 flash 上的坏块却不会导致 mount 不起来。
jiffs2 mount 不上的原因只能去读代码了, 就是要看哪些情况对程序来书哦是不合法的。
yaffs2的代码我阅读过, jiff2 的没仔细研究过,所以不好说。。。

至于 flash IC 自己会标识坏块, 这个说法也是错误的。
标识坏块要靠软件去做,或者说驱动去 修改每个 block 的 第一个 page 的 oob 信息。 具体可以参考 nand flash 的规范。
硬件自己可干不了这事, 具体可参考 内核中的 nand_base.c 和 nand_bbt.c



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c中指针简介

c中指针简介 首先我们来看一下指针的一些基本概念 ![在这里插入图片描述](https://img 而对于指针的应用,平常有一些形式,总结了一下大概有这几种用法 对于以上的几种用法,我依次给出详尽的解释 //这是一个普通的整型变量 1 //首先从P 处开…

判断一个字符串是否另一个字符串的右移后的

首先我们把需要判断的字符串传进来,开辟一块大小为两个字符串的长度总和加1的动态的空间,然后后字符串拷贝函数将一个字符串拷贝到开辟空降中,再将这个字符串再次连接到这块动态的空间中,等于就是将一个字符串拷贝了两遍。然后比较…

登陆后保持环境变量导出

在嵌入式开发中,要保证在系统登录后,导出的环境变量依然有效,需要修改如下文件: /etc/profile export PATH/bin:/sbin:/usr/bin:/usr/sbin export PATH/system/bin:$PATH export LD_LIBRARY_PATH/system/lib export LD_LIBRARY_P…

fasync驱动异步通知机制

fasync简介 编辑异步通知fasync应用于系统调用signal和sigaction函数,简单的说,signal函数就是让一个信号与与一个函数对应,每当接收到这个信号就会调用相应的函数。[1]那么什么是异步通知?异步通知类似于中断的机制,当…

Linux中最常见命令总结

Linux中最常见命令总结 基础命令 命令使用格式 命令名【选项参数】 【操作对象】Ls -a workspace目录命令 Ls 默认显示浏览当前文件目录 -a 显示所有文件,不忽略以点开头的文件 Linux下以.开头的文件是隐藏文件 每个目录下文件的两个特殊目录 . 表示目录自身…

不带头结点的链表基础操作(初始化,增删改查)

链表是什么? **链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括…

fcntl的使用

功能描述&#xff1a;根据文件描述词来操作文件的特性。 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock); [描述] fcntl()针对(文件)描述符提供控…

链表面试题1:反转单链表,不带头结点。

三个指针p1,p2,p3&#xff0c;p1指向头结点的前一个结点&#xff0c;也就时指空&#xff0c;p2指向头结点&#xff0c;p3指向头结点下一个结点。 p3指向p2的下一个&#xff0c;让p2指针域指向p1&#xff0c;让p1挪到p2上&#xff0c;再让p2指向p3.

dup/dup2函数的用法

系统调用dup和dup2能够复制文件描述符。dup返回新的文件文件描述符&#xff08;没有用的文件描述符最小的编号&#xff09;。dup2可以让用户指定返回的文件描述符的值&#xff0c;如果需要&#xff0c;则首先接近newfd的值&#xff0c;他通常用来重新打开或者重定向一个文件描述…

链表面试题2:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

我们可以&#xff0c;用两个新链表&#xff0c;一个存比基准值大的&#xff0c;另一个存比基准值小的。然后再拼接在一起。 用尾插的方法&#xff0c;首先说小的&#xff0c;创建两个指针&#xff0c;一个头&#xff0c;一个尾&#xff0c;再创建个指针跑链表&#xff0c;扫描…

文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别

这两天在调优数据库性能的过程中需要降低操作系统文件Cache对数据库性能的影响&#xff0c;故调研了一些降低文件系统缓存大小的方法&#xff0c;其中一种是通过修改/proc/sys/vm/dirty_background_ration以及/proc/sys/vm/dirty_ratio两个参数的大小来实现。看了不少相关博文的…

栈和队列的基本操作(栈和队列的区别)

数据结构中的栈与内存中的栈的不同 一、数据结构中的堆栈 在数据结构中的堆栈&#xff0c;实际上堆栈是两种数据结构&#xff1a;堆和栈。堆和栈都是一种数据项按序排列的数据结构。 1.栈就像装数据的桶或箱子 我们先从大家比较熟悉的栈说起吧&#xff0c;它是一种具有后进先…

Linux I/O 调度方法

操作系统的调度有 CPU调度 CPU scheduler IO调度 IO scheduler IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调 度器也被叫做电梯. (elevator)而相应的算法也就被叫做电梯算法. 而Linux中I…

编译libcurl

1.下载源码后&#xff0c;执行./buidconf产生configure配置文件 2.通过build.sh来设定configure 配置的参数 #!/bin/sh # export CFLAGS-O3 -w -isystem /home/xuxuequan/Ingenicwork/toolchain/mips-gcc472-glibc216-32bit/mips-linux-gnu/libc/usr/include export CPPFLAGS…

链表面试题3:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成 的。

链表面试题3&#xff1a;将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成 的。 首先我们的思想是将得一个链表和第二个链表的每个结点进行比较&#xff0c;谁小谁就插入到新链表的最后。 首先我们要判段链表是否为空&#xff0c;…

gcc编译参数-fPIC的一些问题

ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so-fPIC 作用于编译阶段&#xff0c;告诉编译器产生与位置无关代码(Position-Independent Code)&#xff0c;则产生的代码中&#xff0c;没有绝对地址&#xff0c;全部使用相对地址&#xff0c;故而代码可以被加载器加载到内存的…

双向链表的操作(创建,插入,删除)

双向链表的代码看似复杂&#xff0c;其实很简单&#xff0c;只要画图便可明白&#xff0c; 删除 假如要删除的结点叫pos. pos->prev->nextpos->next; pos->next->prevpos->prev; free(pos);

我使用过的Linux命令之hwclock - 查询和设置硬件时钟

我使用过的Linux命令之hwclock - 查询和设置硬件时钟 本文链接&#xff1a;http://codingstandards.iteye.com/blog/804830 &#xff08;转载请注明出处&#xff09; 用途说明 hwclock命令&#xff0c;与clock命令是同一个命令&#xff0c;主要用来查询和设置硬件时钟&#x…

二叉树的操作(前,中,后序遍历也叫深度优先遍历,非空结点的个数)递归实现

定义一个二叉树的结点 二叉树的前序遍历&#xff0c; 先访问根结点&#xff0c;再访问左&#xff0c;再访问右。 每次访问都要先看根结点是否为空&#xff0c;然后打印根结点&#xff0c;把此时根结点的左结点作为下一次递归的根结点&#xff0c;当把左结点遍历完后&#xff0…

makefile编译问题记录

1.-c选项和-C选项&#xff1a; -c&#xff08;gcc选项&#xff09;&#xff1a;编译.c或汇编源文件&#xff0c;但是不作连接. 编译器输出对应于源文件的目标文件. 如&#xff1a;$(CC) -c ${CFLAGS} ${SRCS} -C&#xff08;makefile选项&#xff09;&#xff1a;-C的是make…