41 sysfs 文件系统

前言

在 linux 中常见的文件系统 有很多, 如下 

基于磁盘的文件系统, ext2, ext3, ext4, xfs, btrfs, jfs, ntfs 
内存文件系统, procfs, sysfs, tmpfs, squashfs, debugfs 
闪存文件系统, ubifs, jffs2, yaffs  

文件系统这一套体系在 linux 有一层 vfs 抽象, 用户程序不用关心 底层文件系统的具体实现, 用户只用操作 open/read/write/ioctl/close 的相关 系统调用, 这一层系统调用 会操作 vfs 来处理响应的业务 

vfs 会有上面各种文件系统对应的 读写 相关服务, 进而 将操作下沉到 具体的文件系统 

我们这里 来看一下 sysfs 文件系统, 这是一个 基于 内核内存的文件系统, 读写的都是 kobject 的相关信息项, 由内核代码来组织的树形结构 
 

如何分配 inode ?

我们这里的操作是 “cat /sys/module/i8042/parameters/debug”, 访问之前 对应的 inode 还不存在 

sysfs 的 inode 也是懒加载创建的, 当你访问它的时候,才会创建对应的 inode, 这时候 才会在 vfs 中有对应的角色 

sysfs 对应的 iop->lookup 为 kernfs_iop_lookup, 实现如下, 在父级 kernfs_node 下面查询当前文件的 kernfs_node, 然后根据 当前 kernfs_node 去创建, 初始化当前文件对应的 inode

另外就是 kernfs_node 本身会有一套树形结构, 来维护 sysfs 下面各个文件的关系, 以便于这里的 lookup inode 的实现 

kernfs_get_inode 中新建并初始化 inode, ino 取自 kernfs_node 中早就暂存了一个 i_no

iget_locked 中从 super_block 中分配 inode, 并初始化 ino, 将当前 inode 放到了 inode_hashtable 中, 下一次根据 获取直接拿到的是 已有的 inode

kernfs_init_inode 是初始化 inode 的各个函数 

kenfs_init_node 中初始化了 inode->private/i_ops/i_fops 等等, f_ops 用于后面读写 当前文件的操作 

/sys/xx 是在哪里创建的 ? 

从上面可以看到, 系统首先维护的是 kernfs_node 的树形结构

然后 真正的文件的获取是在访问给定的文件的时候创建的, 比如 cat “/sys/module/i8042/parameters/debug”, “ls /sys/module/i8042/”

上面的例子是一个 “cat /sys/module/i8042/parameters/debug” 访问到具体的文件的例子, 这里我们来测试一个 访问目录, 然后 懒加载创建目录下面的所有的 文件的 inode 的过程 

在新建 inode 的地方打上断点, 可以看到的是 外层在迭代 “/sys/devices/breakpoint” 目录下面的所有文件[基于 kernfs_node], 然后通过 lstat 来访问给定的文件, 进而实现主动触发了 文件夹下面所有的文件的访问

然后具体的根据 kernfs_node 迭代文件夹下面所有目录的地方是在这里, dir_emit 会访问给定的文件, 访问上面的 lstat 函数 

接下来问题 便是 kernfs_node 的这棵树的初始化的流程了, 内核是先构造了这棵树, 然后用户/内核 访问 的时候, 再根据 kernfs_node 创建了对应的 inode

kernfs_node树 的初始化是在 内核初始化的阶段, 创建了相关的 kobject, 就会注册 kernfs_node, 挂在 kernfs_node 树上面 

如下是注册 sysfs_root, 也就是 “/sys”

如下是注册 “/sys” 下面的 “fs”, 创建 kobject 的时候, 传入 parent 为 NULL, 默认 parent 是 sysfs_root

又比如我们这里的 i8042驱动 下面的 debug 参数 

此参数是属于 i8042驱动 下面的 参数组 下面的 debug 参数

因此这里在 i8042节点 下面创建了 parameters 节点, 然后作为 debug 参数节点的父节点

然后是循环 i8042 的参数列表, 注册对应的参数在 i8042节点 下面的 parameters节点 上面

创建 kernfs_node 的时候, 传入的 ops 为 sysfs_file_kfops_rw

kn->attr->ops 为 sysfs_file_kfops_rw, kn->priv 为当前 attr 

如何分配 存储的空间?

大多数的 sysfs 的 ”文件” 是不单独占用存储空间的 

是通过相应的读写函数 去操作对应的 kobject

如何 读写数据?

读取的链路如下 

file->f_ops 为 inode 的 f_ops, 为kernfs_file_ops[初始化是在 kernfs_init_inode], 其中 read 为 kernfs_fop_read

下一层 seq_read 的 m->op 来自于封装 file 对象的时候, 初始化的 seq_file, 默认的 ops 为 kernfs_seq_ops

再下一层 of->kn 为 kernfs_node, kernfs_node->attr.ops 为上面构造 kernfs_node 的时候传入的 ops 为 sysfs_file_kfops_rw, 其中 seq_show 为 sysfs_kf_seq_show

接下来就是根据 kernfs_node 中存放的 attribute 的信息, 定位到 module_attribute, param_attribute, kernel_attribute, 然后通过 kernel_attribute 的 ops 来读写 kernel_attribute

如何根据 path 获取到上下文的数据?

在 kernfs_fop_open 的时候, 根据 inode, kernfs_node 以及上下文 构造 file 

kernfs_fop_open 中的 seq_open 中构造了 seq_file, ops 初始化为上下文传入的 kernfs_seq_ops, 构造之后的 file->private_data 为 新建的 seq_file

在外层的 kernfs_fop_open 封装 file, 新建 kernfs_open_file 并初始化, 作为了 ((seq_file)file->private_data)->private_data

seq_open 中新建了 seq_file, 作为 file->private_data

kernfs_fop_open 中 kernfs_node 是来自于 file->f_path.dentry->d_fsdata, 那么这个 d_fsdata 是在哪里填充进去的呢? 

来自于根据 path 向下遍历的时候, i_op->lookup 中在 dentry 中封装了 d_fsdata 为 kernfs_node

完 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

A Greeting from Qinhuangdao Gym - 102769A 2020ccpc秦皇岛分站赛

题意: 给你n个红球和m个蓝色球。然后以相等的概率随机选择了其中两个。选择两个红球的概率是多少? 题目: Welcome to the CCPC Qinhuangdao Site! Qinhuangdao is a beautiful coastal city full of charm, integrating historical herit…

Gartner:6个容器和Kubernetes策略的最佳实用技巧

导语采用容器和Kubernetes要求整个企业保持一致,不了解这些前期现实会导致一些非常严峻的后果。正文Gartner估计,到2022年,将有75%的组织在生产中运行容器化应用程序。毫无疑问,Kubernetes已成为组织容器的流行方法。通…

[JavaWeb-MySQL]约束(非空约束,唯一约束,主键约束,外键约束_级联操作)

约束 * 概念: 对表中的数据进行限定,保证数据的正确性、有效性和完整性。 * 分类:1. 主键约束:primary key2. 非空约束:not null3. 唯一约束:unique4. 外键约束:foreign key* 非空约束&#x…

Friendly Group Gym - 102769F 2020(并查集)ccpc秦皇岛分站赛

题意: n个学生要组成一个小组参加会议(可以不参加), 1.对于每两个朋友(x ,y),如果他们俩都参加会议,该小组的友好价值将会增加 1;如果其中只有一位参加会议,…

测试人员未来的3条出路

大家好,我是Z哥。前两天有个做测试的小伙伴加我微信问我测试相关的一些事情。她自己是从学习毕业就开始进入到互联网行业做测试的,到现在三年工作经验。她现在都不太敢跳槽,因为觉得自己没有什么核心竞争力,平常就是点点鼠标&…

[JavaWeb-MySQL]DQL_查询表中记录,语句

DQL:查询表中的记录 * select * from 表名;1. 语法:select字段列表from表名列表where条件列表group by分组字段having分组之后的条件order by排序limit分页限定2. 基础查询1. 多个字段的查询select 字段名1,字段名2... from 表名&#xff1b…

团体程序设计天梯赛-练习集L1-025 正整数A+B (15分)(getline输入)

题目: 题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。 输入格式: 输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求…

自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧

一:背景1. 讲故事曾今在项目中发现有同事自定义结构体的时候,居然没有重写Equals方法,比如下面这段代码:static void Main(string[] args){var list Enumerable.Range(0, 1000).Select(m > new Point(m, m)).ToList();var ite…

[JavaWeb-MySQL]DDL_操作数据库,表

DDL:操作数据库、表 1. 操作数据库:CRUD1. C(Create):创建* 创建数据库:* create database 数据库名称;* 创建数据库,判断不存在,再创建:* create database if not exists 数据库名称;* 创建数据库,并指定…

Division CodeForces - 1445C(数论因子相关)

题意: 找一个最大的数X,使p%x0且x%q!0,题目保证至少有一个答案满足题意。 题目: Oleg’s favorite subjects are History and Math, and his favorite branch of mathematics is division. To improve his division skills, O…

使用 Windows Terminal 连接远程主机

使用 Windows Terminal 连接远程主机IntroWindows Terminal 是微软新推出来的一个全新的、流行的、功能强大的命令行终端工具。包含很多来社区呼声很高的特性,例如:多 Tab 支持、富文本、多语言支持、可配置、主题和样式,支持 emoji 和基于 G…

[JavaWeb-MySQL]DML_操作表

DML:增删改表中数据 1. 添加数据:* 语法:* insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);* 注意:1. 列名和值要一一对应。2. 如果表名后,不定义列名,则默认给所有列添加值insert into …

.Net Core实现区块链初探

区块链这么火,咱也跟个风。一、前言最近,银行总行关于数字货币即将推出的消息频传,把BTC也带得来了一波反弹。借着这个风,我们也研究一下区块链。通常大家说到区块链,实际包括两部分概念:第一个概念&#x…

Divide and Sum CodeForces - 1445D(排列组合+逆元)

题意: 给定一个长度为2n的数组,将数组分成两个长度为n的数组p,q,将p从小到大排序,将q从大到小排序,对于每种分法,f(p,q)∑i1n\sum_{i1}^{n}∑i1n​|xi−yi|.求总和 题目: You are given an a…

[Java基础]自定义注解之属性定义

代码如下: package AnnoDemo01;public enum Person {p1,p2; }package AnnoDemo01;public interface MyAnno2 {}package AnnoDemo01;public interface MyAnno {int show1();String show2();Person per();MyAnno2 ann02();String[] strs(); }定义了属性,在使用时需要…

微软开源 Tye 项目,可简化微服务开发

微软近期开源了一款开发人员工具 Tye,能够用于简化微服务以及分布式应用程序的开发、测试以及部署过程。项目地址:https://github.com/dotnet/tye。该项目负责人 Amiee 表示,在构建由多个项目组成的应用程序时,开发者通常希望能够…

Subset POJ - 3977(折半枚举+二分+二进制枚举)

题意&#xff1a; 给你一个集合N&#xff08;N<35&#xff09;,问集合的子集&#xff0c;除了空集&#xff0c;使得自己中所有元素和的绝对值最小&#xff0c;若存在多个值&#xff0c;那么选择子集中元素最少的那个。 题目&#xff1a; Given a list of N integers with…

.NET内存管理五大基础知识

1.小对象怎么处理的&#xff1f;小型.NET对象被分配到小型对象堆&#xff08;SOH&#xff09;上。其中有3种&#xff1a;第0代&#xff0c;第1代和第2代。对象根据其寿命向上移动。将新对象放在Gen 0上。当Gen 0充满时&#xff0c;.NET垃圾收集器&#xff08;GC&#xff09;运行…