您的位置:首页 > 其它

UFFS文件系统简介

2015-08-30 14:09 225 查看

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失败,无法回去有效数据

—不会立即处理坏块,而是等待读/写操作完成

—只会在进行读/写操作期间,进行处理坏块

•在格式化时会检查坏块
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息