UBIFS文件系统分析四之UBIFS的六个area


UBIFS中一共分为六个区,分别为

superblock area

master node area

journal (or log)area

LPT(LEB properties tree) area

Orphan area

The mian area

对于第一个区我不准备做介绍,因为superblock是每一个文件系统必备的。

MASTER AREA:UBIFS为了进行垃圾回收,采用了node结构来进行文件的管理,什么是node?我觉得以UBIFS中的一个inode node来打个比方。

struct ubifs_ino_node {

       structubifs_ch ch;

       __u8key[UBIFS_MAX_KEY_LEN];

       __le64creat_sqnum;

       __le64size;

       __le64atime_sec;

       __le64ctime_sec;

       __le64mtime_sec;

       __le32atime_nsec;

       __le32ctime_nsec;

       __le32mtime_nsec;

       __le32nlink;

       __le32uid;

       __le32gid;

       __le32mode;

       __le32flags;

       __le32data_len;

       __le32xattr_cnt;

       __le32xattr_size;

       __u8padding1[4]; /* Watch 'zero_ino_node_unused()' if changing! */

       __le32xattr_names;

       __le16compr_type;

       __u8padding2[26]; /* Watch 'zero_ino_node_unused()' if changing! */

       __u8data[];

} __attribute__ ((packed));

node就是文件信息和数据的一个结合。上面的结构体中除了__u8 data[]之外都可以称之为文件信息,而__u8 data[]称之为文件数据。为了便于垃圾回收,文件系统必须为所有的文件建立这样的树状结构来进行管理。

为了降低启动时的扫描时间和运行的内存消耗,UBIFS将这样的树状结构保持在FLASH上,而不是在内存中。但是问题就来,怎么知道这棵树的根在哪儿?

所以master区就是为了这样的目的,当然不仅仅是为了这样的目的,这棵树的根就保存在masterarea中。

Journal area:上面我们提到了UBIFS中这样的树状结构是保存在flash中,那么就带来了一个问题,每次更新文件(不管是写入、修改还是删除),相应的文件信息和数据都会发生变化,那么这颗树种的结点也会发生变化。而我们知道NANDFLASH的特点,每次重新写入之前必须擦除,可见这样频繁的操作带来的是效率的低下。问了降低片上结点频繁的更新,UBIFS中创建了journal区,在其中缓存对结点的修改,然后一次写到NANDFLASH上去,这样就降低了更新的频率。UBIFS会在内存中建立TNC树(tree node cache),是对flash中这棵树的缓存,这样不可能每次都要到FLASH上去读出node结点的相关信息。在FLASH中的index node在TNC树中为znode。

LPT AREA:我们上面提到了journal area的目的,就是降低数据的更新频率。但是数据如何更新呢?也就是说,这些新添加的数据写往何处?所以必须对flash中每一个块的空间使用情况有一个了解,这就是这儿LPT(LEB propertiestree)的目的。LEBproperties中主要包含三个重要的参数:freespace、dirty space 和whether the eraseblock is an indexeraseblock or not。空闲空间是指可擦除块中未使用的空间。Dirty space 是指一个可擦除块中废弃的(被trunk掉的)和填充的空间的字节数(UBIFS中存在minI/O,也就是最小的写入数据字节数,如果数据不够,就需要padding来填充)。我们上面提到了master区中放的是node树的根,那么它的枝放在哪儿呢?是以index node的形式存放在可擦除块中,所以需要标记一下知道main area中这个可擦除块中存放的是否是index node。LPT area的大小是根据分区的大小来确定的。LPT也有自己的LPT,这是什么意思,就是LPT内部建立了一个ltab(LEB properties table,因为LPTarea所占的可擦出块毕竟是少数,所以采用表的形式),是LPT表所占LEB的LPT。LPT也是在commit的时候更新的。

ORPHAN  AREA:在理解在这个区的作用之前,我们必须准确的了解inode node结点在UBIFS中的作用。用这篇文章中的话来解释的话,A node that holds the metadata for an inode,Every inode has exactly one(non-obsolete)inode node。Orphan area is an area for storingthe inode numbers of deleted by still open inodes,needed for recovery from unclean unmounts。

MAIN AREA:这个区就不用多说了,是用来存放文件数据和index结点的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值