Linux sysfs文件系统实现之顺聊Linux文件系统实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux sysfs文件系统实现之顺聊Linux文件系统实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3403字,纯文字阅读大概需要5分钟。
内容图文
![Linux sysfs文件系统实现之顺聊Linux文件系统实现](/upload/InfoBanner/zyjiaocheng/930/39ed388cb8a843099bca609ef74cac93.jpg)
最近三天写了一个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结构.
本文就此结束,这是我的一些理解,如果不对,欢迎牛人指点,我迅速整改。
(完)
内容总结
以上是互联网集市为您收集整理的Linux sysfs文件系统实现之顺聊Linux文件系统实现全部内容,希望文章能够帮你解决Linux sysfs文件系统实现之顺聊Linux文件系统实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。