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

全部博文(155)

文章存档

2011年(58)

2010年(97)

分类: LINUX

2010-08-05 22:52:48

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见Mail:mtloveft@hotmail.com
Linux Version:2.6.33
提示本文是关于mount命令的实现
 
先来看看mount的详细流程:
 
注册文件系统时要提供两个方法,
get_sb 和 kill_sb 分别在mount 和umount时调用。
而文件系统在内核里是以树状结构存在的,也就是
一个文件系统里可以mount其他的类型的文件系统,
当然也可以mount同类型的文件系统。
每个文件系统可以看作是VSF的一个实例。
mount文件系统就分配一个vfsmount结构。
vfsmount把各个文件系统用各种链表串起来。这样
以后查找文件系统时,根据条件在链表里查找。
命令mount 需要提供几个的参数,简单的格式如下
mount -t vfstype device dir
vfstype就是文件系统名称,device就是设备了,硬盘,cdrom,usb等等
dir 就是要安装的节点。
这个文档是分析最简单的文件系统ramfs,因为它不需要设备,
这样也不需要根buffer cache, device driver等打交道,适合了解文件系统。
不过我认为如果想掌握或者精通文件系统这块,必须分析几个文件系统,
minix比较简单,然后ext2,分析实际的文件系统,掌握这两个其它的就自然
通了,如果做网络通讯的话,sockfs也应该看看,不过有前几个文件系统的
基础的话,sockfs还是比较简单的。至于sysfs, procfs,内核开发经常用,应该
看看。不说废话了,继续分析。
第一步分配vfsmount,并初始化他的各种链表。方法名alloc_vfsmnt()
第二步分配super block, super block 简称sb,这个相当于国骂啦。我是
这个反映,或者是softbank. 为了得到super block 就调用注册文件系统时
注册的get_sb() . get_sb是个漫长的过程。不过内核VSF提供了几个通用的
得到super block 的方法。有
get_sb_nodev  没有设备文件 ramfs 等
get_sb_ns       有设备文件    minix, ext2等
get_sb_single   文件系统只有一个super block 如sysfs等
get_sb_pseudo 不能被客户端mount的文件系统sockfs, pipefs, bdev等
ramfs 是利用ram 的文件系统,所以不需要实际的设备。所以就
用get_sb_nodev这个方法了。
int get_sb_nodev(struct file_system_type *fs_type, int flags, void *data,
 int (*fill_super)(struct super_block *, void *, int), struct vfsmount *mnt)
需要提供fill_super call back 方法。
ramfs的文件系统定义如下,
static struct file_system_type ramfs_fs_type = {
    .name  = "ramfs",
    .get_sb  = ramfs_get_sb,
    .kill_sb = ramfs_kill_sb,
};
get_sb的定义如下
int ramfs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, struct vfsmount *mnt)
{
    return get_sb_nodev(fs_type, flags, data, ramfs_fill_super, mnt);
}
所以callback 方法是 ramfs_fill_super。
 
 
阅读(2272) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

mychz20112011-05-31 09:56:27

日本过得好否?文章很好!