免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4276 | 回复: 11
打印 上一主题 下一主题

请教用LKM写一个文件系统的流程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-29 10:32 |只看该作者 |倒序浏览
20可用积分
我想用LKM写以为文件系统 挂载在VFS下
不知道具体的流程

是不是只要把file_system_type注册到VFS之后
其他的步骤就只是实现文件系统对象file_operations dentry_operation inode_operation?

VFS能自己找的到执行流程吧

我还需要做那些工作?

虚心请教 请高手指点

最佳答案

查看完整内容

显然不是, 你可以用 mount -t proc none /proc 来挂载proc文件系统。 用umount /proc来卸载proc文件系统register_filesystem只是用来注册对应的文件系统, 表示当前内核支持该文件系统, 可以对其做mount操作等等。但是, register_filesystem这个结构体能一个文件系统来说很重要, 因为它指定了如何加载一个文件系统的重要信息。 所以, 一般来说就够了, 当然, 你得好好实现你想实现与你文件系统对应的file_system_type结构体 ...

论坛徽章:
0
2 [报告]
发表于 2010-03-29 10:32 |只看该作者
可不可以这样理解:
1、由于/proc是不能通过mount来安装的,所以必须在内核初始化的时候由内核来安装,所以多了个add_vfsmount()函数?


显然不是, 你可以用 mount -t proc none /proc 来挂载proc文件系统。 用umount /proc来卸载proc文件系统

2、一般文件系统的初始化只需要register_filesystem()就够了?
然后,由此延伸的一些列操作,将由read_super()引发出来?


register_filesystem只是用来注册对应的文件系统, 表示当前内核支持该文件系统, 可以对其做mount操作等等。但是, register_filesystem这个结构体能一个文件系统来说很重要, 因为它指定了如何加载一个文件系统的重要信息。 所以, 一般来说就够了, 当然, 你得好好实现你想实现与你文件系统对应的file_system_type结构体。 最主要的域有:
        int (*get_sb) (struct file_system_type *, int,
                       const char *, void *, struct vfsmount *);
        void (*kill_sb) (struct super_block *);

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2010-03-29 10:37 |只看该作者
其实你可以参考一下proc文件实现的实例

论坛徽章:
0
4 [报告]
发表于 2010-03-29 10:48 |只看该作者
其实你可以参考一下proc文件实现的实例
Godbach 发表于 2010-03-29 10:37



    谢谢,这个是个好办法,不过它只是个内存文件系统, 在挂载的时候好象跟正常的文件系统不同。
    我现在需要把大体的框架弄清楚,先做什么,后做什么。
   
   我在参考ext3文件系统来弄,只是刚开始折腾,搞不清楚与VFS之间的函数调用关系。
   文件系统内部之间调用流程我还是有点了解
   就是不知道如何跟VFS挂钩,除了register_filesystem()之外还需要做什么吗?

论坛徽章:
0
5 [报告]
发表于 2010-03-29 11:03 |只看该作者
我刚才在情景分析上看了下
proc文件系统初始化的时候有二个函数register_filesystem()和add_vfsmount()
对比了一下ext3文件系统的初始化 只有register_filesystem()
可不可以这样理解:
1、由于/proc是不能通过mount来安装的,所以必须在内核初始化的时候由内核来安装,所以多了个add_vfsmount()函数?
2、一般文件系统的初始化只需要register_filesystem()就够了?
然后,由此延伸的一些列操作,将由read_super()引发出来?

论坛徽章:
0
6 [报告]
发表于 2010-03-29 23:18 |只看该作者
表沉了

论坛徽章:
0
7 [报告]
发表于 2010-03-30 14:34 |只看该作者
木有人回答哇

论坛徽章:
0
8 [报告]
发表于 2010-04-06 14:43 |只看该作者
之后, 再给你贴个内核代码:
struct vfsmount *
do_kern_mount(const char *fstype, int flags, const char *name, void *data)
{
        struct file_system_type *type = get_fs_type(fstype);   //  这里。。。。
        struct vfsmount *mnt;
        if (!type)
                return ERR_PTR(-ENODEV);
        mnt = vfs_kern_mount(type, flags, name, data);
        if (!IS_ERR(mnt) && (type->fs_flags & FS_HAS_SUBTYPE) &&
            !mnt->mnt_sb->s_subtype)
                mnt = fs_set_subtype(mnt, fstype);
        put_filesystem(type);
        return mnt;
}

论坛徽章:
0
9 [报告]
发表于 2010-04-07 13:08 |只看该作者
显然不是, 你可以用 mount -t proc none /proc 来挂载proc文件系统。 用umount /proc来卸载proc文件系 ...
Aleaxander 发表于 2010-04-06 14:36



   谢谢 你的电点很详细

    哦 实际上 我也是这样mount的 但是一mount之后就直接crash了
   看来还是我的read_super()函数出了问题

论坛徽章:
0
10 [报告]
发表于 2010-04-07 13:40 |只看该作者
我用mount -t mfs none /mnt/mfs来挂载我写的一个文件系统
   但是报错了
   mount -t mfs none /mnt/mfs
mount: wrong fs type, bad option, bad superblock on none,
       missing codepage or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

  我cat /proc/filesystems  可以找的到我注册mfs文件系统
  nodev   mfs

那么上面的mount为什么会出现这样的情况? 请指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP