声明:本文为原创
#####请转贴时保留以下内容######
作者:GTT
请提出宝贵意见Mail:mtloveft@hotmail.com
Linux Version:2.6.33
提示:本文是关于file system 实现的介绍!
根据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; }
|
注销文件系统的代码就更简单了。就不贴出来了。
由于夏休10天,所以最近一直没有更新blog,这两天回陆续更新。
阅读(1534) | 评论(0) | 转发(2) |