Chinaunix首页 | 论坛 | 博客
  • 博客访问: 751697
  • 博文数量: 79
  • 博客积分: 2671
  • 博客等级: 少校
  • 技术积分: 1247
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-02 15:26
个人简介

宅男

文章分类

全部博文(79)

文章存档

2017年(11)

2016年(12)

2015年(6)

2012年(10)

2011年(33)

2010年(7)

分类: LINUX

2011-03-02 14:48:28

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 nodeTNC树中为znode

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

ORPHAN  AREA:在理解在这个区的作用之前,我们必须准确的了解inode node结点在UBIFS中的作用。用这篇文章中的话来解释的话,A node that holds the metadata for an inodeEvery inode has exactly onenon-obsoleteinode nodeOrphan area is an area for storing the inode numbers of deleted by still open inodesneeded for recovery from unclean unmounts

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

阅读(4081) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~