Chinaunix首页 | 论坛 | 博客
  • 博客访问: 476844
  • 博文数量: 155
  • 博客积分: 5688
  • 博客等级: 大校
  • 技术积分: 2134
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-15 15:12
文章分类

全部博文(155)

文章存档

2011年(58)

2010年(97)

分类: LINUX

2010-08-06 22:48:23

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见Mail:mtloveft@hotmail.com
Linux Version:2.6.33
提示本文是关于file system 实现的介绍
 
先来看看minix在早期linux版本中的实现,以下代码是linux0.11版本的。
超级块的定义如下

struct super_block {
    unsigned short s_ninodes;
    unsigned short s_nzones;
    unsigned short s_imap_blocks;
    unsigned short s_zmap_blocks;
    unsigned short s_firstdatazone;
    unsigned short s_log_zone_size;
    unsigned long s_max_size;
    unsigned short s_magic;
/* These are only in memory */
    struct buffer_head * s_imap[8];
    struct buffer_head * s_zmap[8];
    unsigned short s_dev;
    struct m_inode * s_isup;
    struct m_inode * s_imount;
    unsigned long s_time;
    struct task_struct * s_wait;
    unsigned char s_lock;
    unsigned char s_rd_only;
    unsigned char s_dirt;
}

 
相关说明如下
字段名称
s_ninodes i点数
s_nzones 数据
s_imap_blocks i点位占有的
s_zmap_blocks 数据占有的
s_firstdatazone 数据中第一个数据
s_log_zone_size disk数/逻辑块
s_max_size 最大文件
s_magic 文件系的幻数
   

所以super block 对于FS来说是最重要的数据结构了。
通过SB可以知道Block的安排了。当然就知道了FS的大小了。通过inode bitmaps 就可以知道那个inode还没有被使用,通过block bitmaps就知道数据块中还有哪块没有被使用。整个文件系统就可以被管理了。

i节点的定义如下

struct m_inode {
    unsigned short i_mode;
    unsigned short i_uid;
    unsigned long i_size;
    unsigned long i_mtime;
    unsigned char i_gid;
    unsigned char i_nlinks;
    unsigned short i_zone[9];
/* these are in memory also */
    struct task_struct * i_wait;
    unsigned long i_atime;
    unsigned long i_ctime;
    unsigned short i_dev;
    unsigned short i_num;
    unsigned short i_count;
    unsigned char i_lock;
    unsigned char i_dirt;
    unsigned char i_pipe;
    unsigned char i_mount;
    unsigned char i_seek;
    unsigned char i_update;
}

相关说明如下

字段名称
i_mode 文件型和属性
i_uid id
i_size 文件
i_mtime 修改时间
i_gid id
i_nlinks 接数
i_zone[9] 文件占用的逻辑快数
zone[0]-zone[6]是直接

zone[7]是一次

zone[8]是二次

根据i_zone, 知道了i节点,就知道了对应的数据放到了什么位置。

还有关于目录项的定义

struct dir_entry {
    unsigned short inode;
    char name[NAME_LEN];
}

文件的定义如下

struct file {
    unsigned short f_mode;
    unsigned short f_flags;
    unsigned short f_count;
    struct m_inode * f_inode;
    off_t f_pos;
}

看到了什么,文件中有inode的指针。对文件的动作,最好都会根据inode来对实际数据进行操作。

再来看看minixFS是如何进行数据管理的


 

i3 即inode3如果他是个目录节点的话,它的i_zone[0]将是一个目录数据块号,数据内容将是dir_entry数据结构的数组。这样目录下的
文件名和目录名将全部能产看到。如果目录下文件或者子目录很多的话,可以通过i_zone[7]继续查找到,还有根多的子文件或者
子目录的话,就通过i_zone[8]进行2次间接查找。
D3 即dir_entry3 它的inode 指向i2, 而i2是个二进制文件,那么i_zone[0]将指向一个有实际数据的数据块。

如果知道根节点,那么顺着根节点,可以找到所有的文件和目录,所以根节点是必须设定的。
给定一个i节点,这个i节点下的文件和目录也将可以查找到。有了理论,程序就很容易实现了。
而文件的数据结构struct file根inode关联起来,这样文件的读,写就根据inode可以找到数据的位置了。
minix得结构还是比较简单的,如果了解了minix,其他再复杂的文件系统,也会很快理解的了。
data block 的号码是逻辑号码,读写数据就直接交给harddisk的驱动程序处理,驱动程序根据分区和data block 的号码算出实际的扇区号进行读写。
读出的数据先放到buffer cache,写入的数据也是先放到buffer cache.这样,文件系统就只要和buffer cache 交互就可以了,可以提高工作效率。

我认为minix的几个问题是文件放置的效率,还有,如果super block坏了的话文件系统就崩溃了,可以说无法修复的。因为无法知道根接点的数据
放到什么位置了。安区性问题很严重。当然minixFS 得容量也很小。不过对于教学研究,是很值得研究的文件系统。

 



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