linux下虚拟文件系统介绍

上传人:简****9 文档编号:108447154 上传时间:2019-10-24 格式:DOC 页数:7 大小:48KB
返回 下载 相关 举报
linux下虚拟文件系统介绍_第1页
第1页 / 共7页
linux下虚拟文件系统介绍_第2页
第2页 / 共7页
linux下虚拟文件系统介绍_第3页
第3页 / 共7页
linux下虚拟文件系统介绍_第4页
第4页 / 共7页
linux下虚拟文件系统介绍_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《linux下虚拟文件系统介绍》由会员分享,可在线阅读,更多相关《linux下虚拟文件系统介绍(7页珍藏版)》请在金锄头文库上搜索。

1、super block里有一个字段是用来记录一组的函式,这个字段的型别是super_operations。这个结构在Kernel 2.2.1里包含了11个函式指针。这些指针是要让VFS来呼叫的。因此,这是VFS和档案系统之间的一个接口,经由这层接口,super block可以控制档案系统底下的档案或目录。struct super_operations *s_op;在super_block结构里,s_op就是用来记录这一组的函式。这组函式必须由写档案系统的人来提供。底下我们就来看看super_operations里各个函式应该要提供什么样的功能。struct super_operations v

2、oid (*read_inode) (struct inode *);void (*write_inode) (struct inode *);void (*put_inode) (struct inode *);void (*delete_inode) (struct inode *);int (*notify_change) (struct dentry *,struct iattr *);void (*put_super) (struct super_block *);void (*write_super) (struct super_block *);int (*statfs) (st

3、ruct super_block *,struct statfs *,int);int (*remount_fs) (struct super_block *,int *,char *);void (*clear_inode) (struct inode *);void (*umount_begin) (struct super_block *);不知各位有没有发现,在这11个函式里,居然没有一个函式是用来读super block的。其实也没什么好奇怪的,因为读取super block的函式早在注册档案系统时就要给了,要不然,是谁把super block读出来。因此,我们可以发现super_o

4、perations里只有write_super(),put_super()等等,而没有 read_super()。以下就分别来讨论各个函式应该提供什么样的功能,如果你想自己写一个档案系统,这部分可是很重要的喔。 write_super(sb)故名思义,这个函式主要就是用来将sb这个super block写到磁盘上的。在正常情况下,write_super()应该要检查sb-s_dirt是否为True,只有当s_dirt为True 时才将super block写回disk里。当然,我想这部分主要还是看各个档案系统是如何的implement,但是,记得write_super()最后应该要将 s_di

5、rt设为0,表示这个super block不再是dirty。还有一件事,就是write_super()应该要检查档案系统是否被mount成只读(检查sb- s_flags&MS_RDONLY),或档案系统本身就是只读,像iso9660档案系统,在这种情况下,由于系统是只读,所以,系统设计者可以不提供write_super()或让write_super()不做事。 put_super(sb)当档案系统被umount时,VFS就会呼叫档案系统的put_super()。所以,put_super()要做的事就是将super block所配置的buffer释放掉。此外,一般来讲,如果档案系统是写成mod

6、ule的话,通常在put_super()也会呼叫 MOD_DEC_USE_COUNT将module的reference count减一。至于MOD_INC_USE_COUNT则是应该在read_super()时做的。除此之外,有点要注意,有的人会认为 put_super()应该要将sb释放掉,但是,根据Kernel 2.2.1版的原始码看来,这部分的工作是由VFS来做的。(所谓释放掉并不是呼叫kfree()将super block所占的内存释放,而是将sb-s_dev设成0而已。VFS会自动将s_dev为0的super block视为空的,而拿来重复使用。) read_inode(inode)

7、我想大家看名字就知道了,read_inode()就是去读一个inode,并将它放到传过来的inode结构里。在VFS里,read_inode()只会被 get_new_inode()呼叫,而get_new_inode()又只会被iget()呼叫,所以,事实上,当我们去看Kernel的原始码的时候,我们不会看到直接呼叫read_inode()的情形出现,通常是呼叫iget()传回所要的inode。有的人会有疑问,read_inode() 怎么知道要读那一个inode出来呢? 很简单,在呼叫read_inode()之前,VFS会先在inode结构里填入一些资料,以让read_inode()得知要读

8、那个inode。在 VFS里,它会填入以下的值:inode-i_sb = sb;inode-i_dev = sb-s_dev;inode-i_ino = ino;inode-i_flags = 0;inode-i_count = 1;inode-i_state = I_LOCK;当然,在你自己写的read_inode()里是不会用到这么多资料的,会用到的大概只有i_sb,i_no这两个而已。其实,就跟super block结构一样,inode结构也有一个字段是用来放档案系统自己认为需要的资料,这个字段通常也是在read_inode()中做的,除此之外, read_inode()最重要的一件事就

9、是填入i_op这个字段,这个字段也是一组的函式,这组的函式是用来运作inode的。底下这些程序代码是从 Ext2档案系统的ext2_read_inode()中取出的,它们就是用来填i_op这个字段。else if (S_ISREG(inode-i_mode)inode-i_op = &ext2_file_inode_operations;else if (S_ISDIR(inode-i_mode)inode-i_op = &ext2_dir_inode_operations;else if (S_ISLNK(inode-i_mode)inode-i_op = &ext2_symlink_ino

10、de_operations;else if (S_ISCHR(inode-i_mode)inode-i_op = &chrdev_inode_operations;else if (S_ISBLK(inode-i_mode)inode-i_op = &blkdev_inode_operations; write_inode(inode)write_inode()要做的事就是将inode写回disk。 put_inode(inode)put_inode()是跟read_inode()是相对的。基本上,呼叫一次read_inode()就应该呼叫一次put_inode()。但是,在Kernel中,p

11、ut_inode()跟read_inode()一样是不会直接被使用的。put_inode()只有在iput()中会被呼叫,iget()根据super block以及inode number以取得inode结构,而iput()则是iget()的相反,用iget()取得的inode应该用iput()释放掉。其实,inode 结构里有一个i_count的字段,这是用来记录这个inode的reference count,所以,当我们取得inode时,应该对i_count加1,而在释放inode时则应该将i_count减1,但是,很幸运的,iget() 和iput()已经帮我们做好这件事,我们不用在re

12、ad_inode()和put_inode()中做了。那put_node()应该做什么呢? 它不用将inode中所配置的内存释放掉,因为这件事应该要在inode的reference count等于0而hard link的个数等于0的时候做,VFS会自动帮我们呼叫适当的函式。put_inode()所做的事是根据档案系统而有不同的需求,像在Ext2中就是将 inode的prealloc的block释放掉。但切记,尽管呼叫put_inode()之后,inode-i_count不见得就会变成0,有可能有别的行程在使用这个inode,所以,put_inode()做的事不应该防碍别的行程对此inode的运作

13、。 delete_inode(inode)delete_inode()做的事当然就是将inode删除掉啰。之前说过,当inode的reference count等于0时,VFS会开始将inode所占的内存释放掉。但是,如果这个时候hard link的个数也是0的时候,VFS就会呼叫delete_inode()将inode()从disk上删除掉。所以,user所提供的 delete_inode()要做的事就是把disk上关于这个inode的资料以及档案系统自己本身所配置的东西删除掉。至于释放掉inode所占的内存则交由VFS来做吧。 clear_inode(inode)这个函式是用来将inode

14、结构里的信息清除。档案系统应该只清除自己加在上面的资料,其余的部分应交由VFS来做。在Kernel里,是不会直接呼叫s_op- clear_inode()的,VFS提供一个函式也叫clear_inode(),它会呼叫s_op-clear_inode()。所以,如果有需要用到clear_inode()应该呼叫VFS提供的clear_inode()而不是s_op-clear_inode()。 statfs(sb,statfs,size)这个函式是用来取得档案系统的统计资料,statfs,fstatfs,和ustat这几个系统呼叫其实都是直接呼叫statfs来将传入的 statfs结构填满,档案系统

15、本身的统计资料本来就只有档案系统自己最清楚,所以,statfs()由super block来提供也是最为适当。 remount_fs(sb,flags,options)当一个档案系统已经被mount之后,如果我们想改变mount时所给予给的参数,可以执行mount这个命令,并在其-o参数后加入remount就可以了。基本上,remount所造成的参数改变VFS会帮我们做好,只是,为了怕参数的改变会对档案系统本身造成行为上的改变,所以,当user要求 remount时,VFS会再呼叫叫s_op-remount_fs()以告诉档案系统user要改变mount的参数,如果档案系统本身有需要的话,可以在remount_fs()里做适当的调整,如果觉得不需要,那甚至可以不用提供这个函式让VFS使用。 umount_begin(sb)不知道各位有没有遇到过样的情形,当我们在某个档案系统中时,如果我们正在读写一个档案,可是由于某种不知名的原因,造成segmentation f

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号