伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

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

来源:本站原创 浏览:49次 时间:2023-06-28

最近三天写了一个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结构.

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

(完)


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net