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

全部博文(155)

文章存档

2011年(58)

2010年(97)

分类: LINUX

2010-08-16 18:33:25

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见Mail:mtloveft@hotmail.com
Linux Version:2.6.33
提示本文是关于file system 实现的介绍
 
根据minixext2文件系统结构知识我们可以抽象出以下概念。
对文件操作最终会转化为对inode得操作,因为inode才知道数据放置什么位置,
目录也是文件,是特殊的文件,他的inode对应的数据内容是目录数据的集合。
也就是dentry,通过dentry就可以知道子目录和子文件的名称和对应的inode了。
inode又被super block来管理,super block 可以知道还有多少inode没被使用,同时可以分配inode,销毁inode.
只要知道了root inode ,文件系统下的所有文件和目录都可以顺着root inode找到。
所以现在版本的linux kernel 就是按照这么个逻辑抽象出来了几个数据结构。
file_system_type  :文件系统
super_block          :超级块
inode                :i节点
dentry              :
目录项
file                :文件
早期的linux 只有一个文件系统,当然也就无文件系统下再安装文件系统的概念了。
而现在版本linux都可以在文件系统下再安装文件系统。也就是mount命令。
这就出现了有一个概念,vfsmount, 为什么会有这个数据结构,
其实就是为了管理安装了的文件系统,file_system_type只是定义了文件系统,
每个安装的文件系统可以看作是file_system_typeinstance
先来看看整体概念图
 
 
俺的系统中,EA有时候简体中文会乱码。只能用日文的。NND。
这样文件系统的结构定义不用说你也知道他怎么定义的啦,
上定义:
 
 

struct file_system_type {
    const char *name;
    int        fs_flags;
    int  (*get_sb) (struct file_system_type *, int, const char *, void *, struct vfsmount *);
    void (*kill_sb) (struct super_block *);
    struct module           *owner;
    struct file_system_type *next;
    struct list_head        fs_supers;

    struct lock_class_key   s_lock_key;
    struct lock_class_key   s_umount_key;

    struct lock_class_key   i_lock_key;
    struct lock_class_key   i_mutex_key;
    struct lock_class_key   i_mutex_dir_key;
    struct lock_class_key   i_alloc_sem_key;
};

稍微解释一下,
get_sb, kill_sb当然就是为了得到和销毁super block 了。name是unique的,因为文件系统可以mount多次,所以,
对于一个文件系统,要管理n个super block,所以这些super block 就被fs_supers这个链表链接起来,方便查找。
Linux系统中有多个文件系统,为了对文件系统的管理,注册文件系统时,把所有的文件系统都链接到file_systems
这个结构上,通过next连接的。其他字段可以先不用考虑,影响不大。
结构关系图如下

下面说说文件系统注册,
为了使用文件系统,必须要进行文件系统注册。注册的过程比较简单,就是把
定义的file_system_type结构链接到file_systems上。
根据namefile_systems上查找,没找到的话,把file_system_type结构加入到file_systems这个所谓的链上,
当然找到了的话就说明是重复注册了。
注册的代码如下

int register_filesystem(struct file_system_type * fs)
{
    int res = 0;
    struct file_system_type ** p;

    BUG_ON(strchr(fs->name, '.'));
    if (fs->next)
        return -EBUSY;
    INIT_LIST_HEAD(&fs->fs_supers);
    write_lock(&file_systems_lock);
    p = find_filesystem(fs->name, strlen(fs->name));
    if (*p)
        res = -EBUSY;
    else
        *p = fs;
    write_unlock(&file_systems_lock);
    return res;
}

find_filesystem的代码如下,比较简单,不废话了。

static struct file_system_type **find_filesystem(const char *name, unsigned len)
{
    struct file_system_type **p;
    for (p=&file_systems; *p; p=&(*p)->next)
        if (strlen((*p)->name) == len &&
            strncmp((*p)->name, name, len) == 0)
            break;
    return p;
}

注销文件系统的代码就更简单了。就不贴出来了。

由于夏休10天,所以最近一直没有更新blog,这两天回陆续更新。
 


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