- 论坛徽章:
- 0
|
本帖最后由 mtloveft 于 2010-08-24 19:23 编辑
明明白白我的心--fs series(5)
文章地址:http://blog.chinaunix.net/u3/114767/showart_2300161.html
根据minix和ext2文件系统结构知识我们可以抽象出以下概念。
对文件操作最终会转化为对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_type的instance。
先来看看整体概念图
![]()
俺的系统中,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上。
根据name 到file_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;
- }
复制代码 注销文件系统的代码就更简单了。就不贴出来了。 |
|