分享

Linux sysfs文件系统实现之顺聊Linux文件系统实现

 首家i55ryzehof 2018-08-27

最近三天写了一个jefffs文件系统,是高仿sysfs文件系统实现的,所以想分享一下sysfs文件系统的实现过程,顺道分享一下我对文件系统的一点理解,希望能对看文章的人有点帮助,有帮助记得打赏、打赏、打赏啊(哈哈)。

有人说既然是实现了jefffs为什么不讲下jefffs呢,因为我也痛恨山寨货,虽然本人曾经在深圳华强北帮别人卖过山寨笔记本,但是不能说我不恨它,是这个道理吧。

说到文件系统,用linux的人天天在终端命令行里面狂敲,机械键盘就用来助威提神看谁敲的更响更有节奏感。我们每天见到一些目录和文件,虽然看到的是目录和文件,但是明白些linux底层文件系统就能look through到c语言的数据结构,正如有牛人说他的母语是c语言一样,他认为万事万物都能用c语言来表达。

首先看一下linux下面的文件结构是什么样,图1:(画的丑,请见谅)

可以看到这个树形结构从“/”目录开始,“/”相当于文件系统的祖宗,其他的结构都要从这里派生。这个图最关键的一点就是想说明每一个目录或者一个文件在linux中都用一个dentry结构来表示。这个可能是最大的误解,不要以为dentry只是代表一个目录。

还想强调一点的是,希望看完此文章以后,再看linux终端下的文件和路径,你就直接把它想象成一个一个树形连接的dentry结构就好了,就像《越狱》的男主角迈克一样,它看到一个台灯,就直接看到里面的线圈。

文件系统的实现最最主要的一件事情就是建立dentry,在文件系统内部建立一整套树形结构的dentry,然后挂载在'/'的树下面去,我们会发现linux kernel文件系统的实现过程中,做的最主要的事情就是玩命的建立一个根dentry,由struct super_block结构中的s_root成员来指向,根dentry建立以后就可以来挂载了,

我们一般在linux下面会敲这样的命令:

mount sysfs -t sysfs /sys

可以认为这个命令就是把sfsfs文件系统中的根dentry替换到“/”下面的sys的dentry结构,替换以后'/'下sys结构下的所有文件就消失,其实只是暂时雪藏看不到了,就变成sysfs文件系统从根dentry开始的所有文件和目录,当初的/sys的inode号也会变成sfsfs文件系统根目录的inode号,因为dentry结构就指向了inode结构,inode结构中用ino成员表示inode号,当初的/sys可能属于ext4文件系统,现在换东家了变成了sysfs文件系统的成员了,当然了,umount sysfs以后,就会恢复原貌。

接着再上一张(dao)图(cai):图2:

如上文所说,要想建立文件系统,就要建立一串一串的dentry结构,在sysfs文件系统mount初始化的过程中,就建立起了根dentry.接下来的工作就是从这个根dentry上面做文章,来挂串串了。

我们看图2,sysfs每一个目录或者文件都有一个dentry结构,dentry下面有inode,dentry有一个私有变量d_fsdata,这是指向kernfs_node数据结构的,然后kernfs_node也有一个私有变量priv,对于一个目录来说,priv指向的是大名鼎鼎的kobject成员,对于一个文件来说,priv指向的是attribute数据结构。

当调用kobject_init_and_add函数时,就可以往parent的kernfs_node挂上kernfs_node结构,这样一个个kernfs_node挂上去以后不是还没有满足挂上一个个的dentry吗,先不用急,当用户层输入ls命令的时候会调用到inode数据结构中inode_operations函数集里面的lookup函数,此时,根据dentry底下已经连接好的kernfs_node结构模型再把上层的dentry和inode结构通通建好,此时dentry结构建立完毕。

现在说说kobject,从图上可知,dentry结构和kernfs_node结构都建立好以后,kobject(属于一个目录)自然而然一个个kobject都能随之链起来。

我们经常在用户层read或者write sysfs文件系统一个文件时,其实就是首先调用到kernfs_node中的函数集kernfs_ops中的读写方法,然后会调用kernfs_node的父kernfs_node中的kobject中的读写方法,kobject中有成员指向一个个attribute,而这个attribute又是包含在像bin_attribute结构中,从而调用到针对本文件的读写方法。

最后简单说说kset,kset包含一个kobject结构,把kset插入到sysfs文件系统中,其实就是跟上面一个把kobject插进去,构建kernfs_node,从而构建dentry结构.

本文就此结束,这是我的一些理解,如果不对,欢迎牛人指点,我迅速整改。

(完)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多