UFFS文件系统简介

UFFS基础思想

1.采用独特的 父类(Parent)和序列号(Serial)实现
    —块的识别
    —建立关系

这里写图片描述

2.当加载UFFS时,会在内存中建立关系树。
—擦除块
—坏块
—Hash tables(哈希表)
•目录表
•文件表
•文件数据表
树节点的大小:16 bytes
存储所花费的内存: 16*总块数

3.分录
—向一块新的内存或者内存页写入新的数据 代替 去修改一个旧的内存页
—使用循环时间标记:00->01->11->00>…
—当加载UFFS时,检查并纠正错误
—使用“迷你-头”,消除部分页的规划要求

4.UFFS节点树
这里写图片描述

5.UFFS准备
步骤1:
—扫描叶备份空间,归类 目录/文件/数据节点
—检查坏块
—检查中断写操作
步骤2:
—随机擦除块
步骤3:
—检查DATA节点,关注孤立节点
这里写图片描述

6.UFFS附加标记
页备用/UFFS标记
这里写图片描述

7.UFFS块消息缓存
这里写图片描述
内存:每个缓存信息有40字节

8.UFFS页缓存

uffs_config.h:
MAX_PAGE_BUFFERS (10 ~ 40)
Memory: (40 + page_size) each buffer
struct uffs_BufSt{
struct uffs_BufSt *next;
struct uffs_BufSt *prev;
struct uffs_BufSt *nextDirty;
struct uffs_BufSt *prevDirty;
u8 type;
u8 ext_mark;
u16 parent;
u16 serial;
u16 pageID;
u16 mark;
u16 refCount;
u16 dataLen;
u8 * data;
u8 * header;
};

9.UFFS页状态
•空闲页:没有分配到页ID,空闲页总在底部
•有效页:拥有页ID,并且最大偏移量
•丢弃页:存在一个或者多个页,与当前页拥有一样的
页ID,并且偏移量比当前页高
•未知状态:当向一个页进行写操作时发生了中断
这里写图片描述
10.UFFS块状态
•坏块
•空闲/擦除 块
•非满载 块(有一个或者多个空闲页)
•满载块(没有空闲也,并且页ID=物理页偏移)
这里写图片描述

11.UFFS块恢复
•块恢复时发生:
—在块内,没空闲页可用
—数据进行修改
—刷新缓存
•块恢复步骤:
—(1)从擦除块列表中,获取一个空闲/擦除块。
—(2)从旧块中复制数据并写入新块,并更新时间标示
—(3)删除旧块
—(4)把旧块添加入擦除块列表中
注释:(1)和(4)的操作在内存中。
(2)和(3)是通过时间标记来辨别的。所有步骤在任何时候都可被中断。
•如果有足够的空闲页,是不会进行块恢复的
这里写图片描述
•恢复非满载块
这里写图片描述
•恢复一个满载块
这里写图片描述
12.UFFS页分布
这里写图片描述
•“mini-header”和“DATA”存储在页的数据区域, “Tag”,“ECC”和“Seal byte”存储在备份区
•在某些情况下,可以把NAND当成一个整体处理,模糊了 页数据 和 备份区的概念。
•“Status byte”:是mini-header的第一个字节,如果Status byte不是0xFF ——则这一叶是损坏的,
页的程序已经启动。
•“Seal byte”:是备份区的最后一字节,如果Seal byte不是0xFF
——当前页被保护,则所有数据和 tag/ECC 已经被编程成功

13.UFFS坏块管理
•当加载UFFS时会查找坏块
•当进行读/写/擦除操作时会发现坏块
—进行ECC校验
—如果ECC失败,无法回去有效数据
—不会立即处理坏块,而是等待读/写操作完成
—只会在进行读/写操作期间,进行处理坏块
•在格式化时会检查坏块

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值