全部博文(185)
分类:
2012-04-13 23:55:58
原文地址:UBIFS文件系统分析(三):UBIFS的六个area 作者:mournjust
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 {
struct ubifs_ch ch;
__u8 key[UBIFS_MAX_KEY_LEN];
__le64 creat_sqnum;
__le64 size;
__le64 atime_sec;
__le64 ctime_sec;
__le64 mtime_sec;
__le32 atime_nsec;
__le32 ctime_nsec;
__le32 mtime_nsec;
__le32 nlink;
__le32 uid;
__le32 gid;
__le32 mode;
__le32 flags;
__le32 data_len;
__le32 xattr_cnt;
__le32 xattr_size;
__u8 padding1[4]; /* Watch 'zero_ino_node_unused()' if changing! */
__le32 xattr_names;
__le16 compr_type;
__u8 padding2[26]; /* Watch 'zero_ino_node_unused()' if changing! */
__u8 data[];
} __attribute__ ((packed));
node就是文件信息和数据的一个结合。上面的结构体中除了__u8 data[]之外都可以称之为文件信息,而__u8 data[]称之为文件数据。为了便于垃圾回收,文件系统必须为所有的文件建立这样的树状结构来进行管理。
为了降低启动时的扫描时间和运行的内存消耗,UBIFS将这样的树状结构保持在FLASH上,而不是在内存中。但是问题就来,怎么知道这棵树的根在哪儿?
所以master区就是为了这样的目的,当然不仅仅是为了这样的目的,这棵树的根就保存在master area中。
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 properties tree)的目的。LEB properties中主要包含三个重要的参数:free space、dirty space 和whether the eraseblock is an index eraseblock 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 storing the inode numbers of deleted by still open inodes,needed for recovery from unclean unmounts。
MAIN AREA:这个区就不用多说了,是用来存放文件数据和index结点的。