40 proc 文件系统

news2025/2/12 20:01:43

前言

在 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 会有上面各种文件系统对应的 读写 相关服务, 进而 将操作下沉到 具体的文件系统 

我们这里 来看一下 proc 文件系统, 这是一个 基于 内核内存的文件系统, 读写的都是 内核的相关信息项 

如何分配 inode ?

inode 的创建是 懒加载 的, 也就是 第一次访问的时候 vfs 在 i_ops 中预留了 lookup, 基于这个函数 来实现的懒加载, 如果没有找到, 则新建给定的文件对应的 inode, 以及初始化 i_ops, f_ops 的相关操作 

这里传入的 ptr, 是当前访问的 进程文件 的一个配置信息, 如 stat, cmdline 对应于不同的配置, 对应于 pid_entry 

各个 pid_entry 的配置如下, 比如 cmdline, 定义了文件标志, 用户/组/其他用户的读写执行权限, 具体当前文件的 读写 相关 api 的具体实现 

比如说 /proc/$pid/cmdline 文件的相关 api 如下 

我们来看一下 inode 的相关处理, inode 的分配是来自于 proc 对应的 fs 的 super_block 

这里初始化了 读写权限, inode, m/i/c/time, i_op, f_op, pid, uid, gid 等等相关属性 

其中 f_op 在上面 cmdline 的例子中就对应于 proc_pid_cmdline_ops, 然后实际操作的时候 vfs 会将操作委托给 这个函数 

新增了 inode 之后, d_add 会将 inode 注册到 dcache.dentry_hashtable 中

/proc/$pid 文件夹中的各个文件什么时候创建的?

是在 你访问的时候创建的, 比如你 直接读取 "/proc/$pid/cmdline" 或者 "ls /proc/$pid" 的时候创建的 

如下为 ls "/proc/321" 的时候, 会遍历 ents 来创建对应的文件, 这的 ents 对应于上面的 tgid_base_stuff 的列表, 对应于 进程需要创建的 pid 相关的所有文件的信息 

如何分配 存储的空间?

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

是通过对应的 读写函数 直接读取业务数据结构的相关信息 直接返回 

如何 读写数据?

根据文件路径 查询到文件对应的 inode, 封装 file, file->f_op 为 inode->f_op 

对应于 /proc/$pid/cmdline 读取函数为 proc_pid_cmdline_ops, 如下图 即为完整的调用栈 

申请一个临时物理页, 然后读取给定的进程的 mm 的 arg_start + offset 的数据, 读取到 argv_end 

读取出来的内容其实就是 cmdline 的内容, 即所有的参数 

其中 argv[0] 为当前执行程序, argv[1], argv[2], ..., argv[n] 为用户传入的程序参数  

这里读取到了 21 个字符 "./Test05SocketServer"

然后将数据从 物理页 拷贝到 用户空间的 buffer, 得到 "./Test05SocketServer" 

用户程序这边 cat 输出结果为 

再比如 /proc/$pid/oom_score, 的读取 

使用的另外一种方式来读取文件的数据, 输出数据到 seq_file, 这个是 封装 file 的时候, linux 构造的一个容器 

输出如下 

再比如 /proc/$pid/status, 的读取 

输出如下 

根据 path 获取到 inode 的过程 

上面提到了 新建的 proc 的 inode 放在了 dcache.dentry_hashtable 

那么 linux 又是怎么讲 path 和 dcache.dentry_hashtable 关联起来的呢? 

在常见的 ext4 文件系统中, 文件夹的 inode 信息是放在了 inode 的文件内容中的, 那么 proc 文件系统是怎么做的呢 ? 

path_init 的时候初始化 nd 中为 根文件系统的 inode, dentry, 然后 link_path_walk 一个文件夹一个文件夹的向后遍历, 调整 nd, do_last 处理目标文件/文件夹 

所以这里 "/proc/310/cmdline" 会 调用一次 path_init, 两次 link_path_walk, 第一次 do_last 

我们这里 着重关注 link_path_walk 

第一次 link_path_walk 的处理, __d_lookup_rcu 的时候, 在 rootfs  "/" 下面的 rootfs "/proc" 

注意这里的 __d_lookup_rcu 查找的是 dcache.dentry_hashtable

follow_mount_rcu 之后, 查询 "/proc" 是否有挂载点, 如果有 更新到对应的挂载点上面去 

nd 中的 dentry 信息, 由 rootfs "/proc" 更新为了 proc "/", 这里 mount 信息是记录在 namespace.mount_hashtable 中, 在 mount 的时候会记录相关信息 

第二次 link_path_walk 的处理, 是在 proc "/" 下面查找 "310", 这里找到了这个 proc "310" 的 dentry 

注意这里的 __d_lookup_rcu 查找的是 dcache.dentry_hashtable, 因为在创建 inode 节点的时候, 向 dcache.dentry_hashtable 中注册了 dentry 的信息, 因此这里能够查到 

proc "/310" 上面没有其他的挂载点, 因此获取到的数据 还是原有的 proc "310" 对应的 dentry, inode 

do_last 中 lookup_fast 从 dcache.dentry_hashtable 中在 proc "310" 下面查找 "cmdline" 

能够找到 proc "/310/cmdline" 

do_dentry_open 中根据上下文的相关信息, 填充 file 对象  

然后最外层 sys_open 中建立 fd -> file 的映射 

这里放进去的就是 read/write 中根据 fd 拿到的 file 

file.f_ops 为对应的 inode.f_ops 

完 

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

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

相关文章

为何不禁用危险的memcpy或更新memcpy源码,而使用更安全的memcpy_s

关于使用更安全的memcpy_s而不禁用危险的memcpy或更新memcpy源码的问题,以下是一些考虑因素:首先,memcpy_s并不是绝对安全的实现。尽管它要求您提供一个长度参数来确保不会发生溢出或越界问题,但这个长度仍然需要您自己提供&#…

液压系统比例阀放大器US-DAT2-F、US-DAPQ-N、US-DAS2

比例放大器US-DAS1、US-DAS2、US-DAPQ-N、US-DAPQ-H、US-P1、US-P2、US-DAT2-F、US-DAT2-A适配控制各种不带位置反馈比例阀; 控制如博世力士乐(Bosch Rexroth)、伊顿威格士(EATON Vickers)、油研(YUKEN&am…

从小白到大神之路之学习运维第78天-------Kubernetes集群应用部署测试

第四阶段 时 间:2023年8月11日 参加人:全班人员 内 容: Kubernetes集群应用部署测试 目录 应用部署测试 应用部署测试 下面我们部署一个简单的Nginx WEB服务,该容器运行时会监听80端口。 (一)环境…

vue报错‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

运行我的后台管理项目的时候报错:‘vue-cli-service’ 不是内部或外部命令,也不是可运行的程序或批处理文件。 查看自己package.json中是否有vue 或者vue-cli-service 查看自己项目目录下有没有node_module文件夹,如果有删除,然后…

uprobe trace多线程mutex等待耗时

问题背景环境 ubuntu2204 服务器支持debugfs uprobe,为了提升应用程序的性能,需要量化不同参数下多线程主程序等待在mutex上的耗时区别 linux document中对uprobe events的说明如下 uprobetracer.rst - Documentation/trace/uprobetracer.rst - Linux…

什么是分布式系统,如何学习分布式系统

正文 虽然本人在前面也写过好几篇分布式系统相关的文章,主要包CAP理论,分布式储存与分布式事务,但对于分布式系统,并没有一个跟清晰的概念。分布式系统涉及到很多的技术、理论与协议,很多人也说,分布式系统…

股票自动交易接口开发原理及源码分享

股票自动交易接口的开发原理涉及多个方面,主要包括以下几个步骤: 1. 数据接口获取:通过连接到证券交易所或第三方数据提供商的API,获取实时市场数据,包括股票报价、交易成交量、买卖盘口等信息。 2. 策略定义&#x…

分类预测 | MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测

分类预测 | MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测 目录 分类预测 | MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测分类效果基本介绍模型描述程序设计参考资料 分类效果 基本介绍 1.MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测,CNN-BiLSTM结…

数据结构篇七:排序

文章目录 前言1.插入排序1.1 基本思想1.2 代码实现1.3 特性总结 2.希尔排序2.1 基本思想2.2 代码实现2.3 特性总结 3. 选择排序3.1 基本思想3.2 代码实现3.3 特性总结 4. 堆排序4.1 基本思想4.2 代码实现4.3 特性总结 5. 冒泡排序5.1 基本思想5.2 代码实现5.3 特性总结 6. 快速…

数据库SQL查询语句的执行顺序是怎么样的?

目录 1. 引言 2. SQL查询语句举例 3. SQL查询语句顺序执行误区 4. 查询语句步骤分析 5. SQL查询语句执行顺序总结 6. 面试小问题 6.1 WHERE 和 HAVING 谁的过滤范围更广? 6.2 为什么 WHERE 之后不能使用聚合函数进行过滤? 6.3 为什么 WHERE 的执…

一文了解SmartSE

你或许没有听说过SmartSE,但你一定听说过“Virtual Electronic”,也就是“V-ECU”,虚拟ECU。2020年,ProSTEP iViP协会的SmartSE项目组出版了白皮书,对虚拟ECU做了详尽介绍。 ProSTEP iViP协会成立于1993年&#xff0c…

远程预付费平台助力转供电主体解决“收费难” 安科瑞 顾语欢

为了帮助物业合理收取转供电电费以及过程中的运营成本,安科瑞AcrelCloud-3200远程预付费平台解决方案根据分时电价政策配置合理的计费仪表和软件,帮助转供电主体完成电费统计、电网损耗、租户公共用电公摊,协助转供电主体更高效的解决电费收取…

Navicat 针对金融用户的投票调查 | 诚邀您的参与,让 Navicat 更优!

Navicat 是一款流行的数据库管理工具,它可以帮助用户更轻松地管理和维护数据库。一直以来,Navicat 在金融业(银行、保险、证券和互联网金融服务业等)得到广泛应用。目前,浦发银行、邮储银行、农业银行、中国银联和泰康…

Arcgis地图实战二:地图实时轨迹展示

1.最终效果预览 2.定时器执行方法 进入页面执行执行器 this.locationInterval setInterval(() > {this.getCurrentPosition();}, this.conf.LocateInterval);离开页面销毁 clearInterval(this.locationInterval);this.conf.LocateInterval为获取的数据同步中的定时器间隔…

UE4/5 GAS技能系统入门3 - GameplayEffect

阅读本文需要上一篇AttributeSet的基础知识: https://blog.csdn.net/grayrail/article/details/132148492 本文也并非教程性质文章,主要讲解学习记录为主。 这篇开始讲AttributeSet配置好后,GameplayEffect的使用。 1.将GE配置至Ability Co…

计算机竞赛 - 基于机器视觉的图像拼接算法

前言 图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧,…

远程RDP、远控手机、双屏控双屏,向日葵“瓜子会员”妥妥的真香

最近儿有点“小感冒”,没去公司在家歇着,居家归居家,砖还是要搬的,突然来活了也得及时的处理掉,这种时候我一般用远程桌面的方式,之前就一直用的向日葵远程控制。 为啥用远程桌面呢?主要原因是家…

31 | 独角兽企业数据分析

独角兽企业:是投资行业尤其是风险投资业的术语,一般指成立时间不超过10年、估值超过10亿美元的未上市创业公司。 项目目的: 1.通过对独角兽企业进行全面地分析(地域,投资方,年份,行业等),便于做商业上的战略决策 项目数据源介绍 1.数据源:本项目采用的数据源是近…

独立站还值不值得入?先来了解最新趋势!

近年来,随着跨境电商行业的蓬勃发展,跨境卖家的数量持续攀升,然而由于亚马逊等跨境电商平台对第三方卖家的规则约束越加严厉,目前有很多卖家都在考虑平台转型独立站。与此同时,独立站 SHEIN、Anker、DX 的成功&#xf…

Git全栈体系(五)

第八章 IDEA 集成 GitHub 一、设置 GitHub 账号 如果出现 401 等情况连接不上的,是因为网络原因,可以使用以下方式连接: 然后去 GitHub 账户上设置 token。 点击生成 token。 复制红框中的字符串到 idea 中。 点击登录。 二、分享工程…