一步一步粗谈linux文件系统(三)----超级块(superblock)【转】

本文转载自:https://blog.csdn.net/fenglifeng1987/article/details/8302921

超级块是来描述整个文件系统信息的,可以说是一个全局的数据结构,可以把它理解成文件系统的心脏

 

比较简单的文件系统中(如ramfssysfs),超级块的初始化大致分三步:

1sget

2fill_super

3simple_set_mnt

 

sget

/**

 *        sget        -        findor create a superblock

 *        @type:        filesystemtype superblock should belong to

 *        @test:        comparisoncallback

 *        @set:        setupcallback

 *        @data:        argumentto each of them

 */

struct super_block*sget(struct file_system_type*type,                //得到一个超级快superblock

int(*test)(struct super_block *,void *),

int(*set)(struct super_block *,void *),

void*data)

这个函数的意思其实很简单明了,就是为超级块alloc一块空间出来,并有主流的初始化操作。

fill_super

这个各个文件系统有着自己的填充函数,but万变不离其中的是,sb->s_opsb->s_root(dentry),还有一个inode。其中inode中又会有各个系统特有的操作,i_fopi_op,i_mapping。这个文件系统第一个inode,dentry,后续的很多操作都是基于这一步开始的。linux万物皆文件,文件皆目录(dentry),目录指节点(inode),其实很多操作皆出自inode,切记切记。

将文件系统中的操作大致赋值定型,个人觉得,如果要深入了解某个文件系统的话,这部分过程得用笔记记下来,然后接下来调用操作的时候,能一目了然。这部分真的很重要的。

simple_set_mnt:

intsimple_set_mnt(struct vfsmount *mnt, struct super_block *sb)

{

mnt->mnt_sb= sb;

mnt->mnt_root= dget(sb->s_root);

return0;

}

这部分很简单,因为最终需要返回的是mnt,而非sb,所以要将sb挂到mnt上。

posted @ 2018-06-22 10:00  请给我倒杯茶  阅读(802)  评论(0编辑  收藏  举报