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

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

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

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

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

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

        可以看到这个树形结构从“/”目录开始,“/”相当于文件系统的祖宗,其他的结构都要从这里派生。这个图最关键的一点就是想说明每一个目录或者一个文件在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:

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

    如上文所说,要想建立文件系统,就要建立一串一串的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结构中,从而调用到针对本文件的读写方法。

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

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

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

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

(完)


上一篇:zero-to-jupyterhub如何自定义内存和CPU


下一篇:python-jupyterhub通过docker方式安装