Linux 内核源码分析---proc 文件系统

news2024/9/25 17:15:38

proc文件系统

进程数据文件系统(process data filesystem, procfs)装载在 /proc,缩写为 procFS。

proc 文件系统是一种虚拟文件系统,其信息不能从块设备读取。只有在读取文件内容时才动态生成相应的信息。使用proc文件系统,可以获得有关内核各子系统的信息(如内存利用率、附接的外设,等等),也可以在不重新编译内核源代码的情况下修改内核的行为,或重启系统。

proc 文件系统提供一种接口,可用于该机制导出的所有选项,直接地修改参数无需开发专门程序,只需要一个shell和标准的 catecho 程序即可。

/proc信息
尽管proc文件系统的容量依系统而不同,其中仍然包含了许多深层嵌套的目录、文件、链接。信息可以分为以下几大类:
(1)内存管理;
(2)系统进程的特征数据;
(3)文件系统;
(4)设备驱动程序;
(5)系统总线;
(6)电源管理;
(7)终端;
(8)系统控制参数。

Linux系统上的/proc目录是一种文件系统,即proc文件系统。
/proc是一种伪文件系统(也即虚拟文件系统),具体目录如下:
在这里插入图片描述
在这里插入图片描述

proc 常见文件

buddyinfo:用于诊断内存碎片问题。
cmdline:在启动时传递至内核的相关参数信息,这些信息通常由lilogrub等启动管理工具进行传递;
cpuinfo:处理器的相关信息的文件;
crypto:系统上已安装的内核使用的密码算法及每个算法的详细信息列表;
devices:系统已经加载的所有块设备和字符设备的信息;
diskstats:每块磁盘设备的磁盘 I/O 统计信息列表;
filesystems:当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;
interrupts:X86 或 X86_64 体系架构系统上每个 IRQ 相关的中断号列表;
iomem:每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息;
ioports:当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;
kallsyms:模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;
locks:保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;
meminfo:系统中关于当前内存的利用状况等的信息,常由free命令使用;
mounts:在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统;
modules:当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;
partitions:块设备每个分区的主设备号(major)和次设备号(minor)等信息;
stat:实时追踪自系统上次启动以来的多种统计信息;
swaps:当前系统上的交换分区及其空间利用信息;
uptime:系统上次启动以来的运行时间;
version:当前系统运行的内核版本号;
vmstat:当前系统虚拟内存的多种统计数据;
zoneinfo:内存区域(zone)的详细信息列表;

proc 数据结构

1、proc 核心数据结构
实现 proc 文件系统的代码紧围绕这些结构而建立的,proc 大量使用 VFS 的数据结构,因为作为一种文件系统,它必须集成到内核的 VFS 抽象层中。

还有一些特定于 proc 的数据结构,用于组织内核提供的数据信息。还必须提供一个到内核各个子系统的接口,使得内核能从其数据结构中提取信息,然后借助 /proc 提供给用户空
间。proc 文件系统中的每个数据项都由proc_dir_entry的一个实例描述,
在这里插入图片描述

2、装载proc文件系统
内核内部用于描述 proc 文件系统结构和内容的数据已初始化之后,下一步是将该文件系统装载到目录树中。在内核添加新文件系统时,会扫描一个链表,查找与该文件系统相关的file_system_type实例。

在这里插入图片描述

proc 文件系统的超级块由proc_get_sb提供。该函数基于另一个内核辅助例程( get_sb_single),借助proc_fill_super(主要负责用一些定义后从不改变的值来填充 super block 的每个成员)来填充一个super_block的新实例。
在这里插入图片描述

proc_sops 中对超级块的各个操作,其中收集内核管理proc文件系统所需的各个函数,
在这里插入图片描述

静态的proc_dir_entry实例:
在这里插入图片描述

管理 /proc 数据项

1、数据项的创建和注册
新数据项分两个步骤添加到proc文件系统。首先,创建proc_dir_entry的一个新实例,填充描述该数据项的所有需要的信息。
使用fs/proc/generic.c中的proc_register将其注册到proc文件系统当中:

在这里插入图片描述

创建数据项之后,注册到 /proc 文件系统步骤:
a.生成一个唯一 proc 内部编号,向数据项赋予身份。get_inode_number 返回一个未使用的编号,用于为动态生成的数据项;
b.必须适当地设备proc_dir_entry实例的 nextparent 成员,将新数据项集成到 proc 文件系统的层次结构中;
c.如果此proc_dir_entry成员的proc_iopsproc_fopsNULL指针,那么需要根据文件类型,适当地设备指向file_operationsinode_operations结构实例的指针。

用于管理proc数据项:
proc_mkdir创建一个新目录;
proc_mkdir_mode创建一个新目录,目录的访问权限可以显式指定;
proc_symlink生成一个符号链接;
remove_proc_entry从proc目录中删除一个动态生成的数据项;

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

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

相关文章

WPF篇(7)- Control基类+ContentControl类(内容控件)+ButtonBase基类

前面给大家介绍完了WPF所有的布局控件,属性以及使用案例,从这里咱们就开始学下内容控件。 Control基类 Control是许多控件的基类。比如最常见的按钮(Button)、单选(RadioButton)、复选(CheckBox)、文本框…

【JavaEE初阶】JUC(java.uitl.concurrent)的常见类

🌴Callable 接口 之前讲到Runnable接口,用于描述一个任务,通过Runnable中的run方法来体现的,但是描述的任务没有返回值(run方法是返回void),此处的Callable接口与Runnable接口类似,C…

LLVM理论篇之编译器前端

1、简述 LLVM前端通过对源程序的预处理,构成源程序的字符流扫描与分解,将单词序列提取为各类语法短语,生成抽象语法树,最终转换为中间代码。编译器前端包含的这几个过程如下: (1)预编译 &…

【python】实现对文件夹中的图像连续重命名方法

import os import shutildef rename_images(input_folder):# 获取输入文件夹下的所有图片文件(假设都是.jpg格式)image_files [f for f in os.listdir(input_folder) if os.path.isfile(os.path.join(input_folder, f)) and f.endswith(".jpg"…

性能测试工具LoadRunner

前言👀~ 上一章我们介绍了性能测试的一些基本概念,重要的是性能测试的各项指标,今天我们使用性能测试工具LoadRunner简单的完成一次性能测试 性能测试Load Runner LoadRunner是什么? LoadRunner安装 LoadRunner脚本录制 1.录…

振弦式钢筋计的主要应用领域有哪些?

在现代工程建设中,钢筋作为重要的结构材料,其应力状态直接关系到工程结构的安全性和稳定性。因此,对钢筋应力的实时监测成为了保障工程质量的关键环节。振弦式钢筋计作为一种高精度、稳定性好的应力监测仪器,在桥梁、建筑、隧道等…

pg一些常用语句记录

查看数据库大小 pg_size_pretty:将数据库用量展示为KB、MB、GB等样式,查看更直观查看具体某个数据库的大小 select pg_size_pretty(pg_database_size(postgres)); 查看所有数据库的大小 select pg_database.datname, pg_size_pretty (pg_database_size(pg_database.datnam…

Sqli-labs-master靶场--布尔盲注

目录 1、布尔盲注 2、布尔盲注的流程(以靶场less-8为例) 2.1输入id尝试是否存在注入点 2.1.1通过以上尝试,联想到可能是布尔盲注 2.2猜测数据库长度 2.3获取数据库名 2.3.1python脚本获取 代码: 获取结果为: …

后期调色学习笔记

关于调色曲线的学习: 学习链接:一看就懂的曲线调色教程【手机摄影后期】_哔哩哔哩_bilibili 从左向右就是由暗部越来越到亮部 越靠近右侧的越是亮部

机械学习—零基础学习日志(数学基础汇总1)

零基础为了学人工智能,正在艰苦的学习 我比较推荐,《三个月从零入门深度学习,保姆级学习路线图》的整体学习思路,但因为数学基础太差,而且针对所需的数学系统知识,我依然没有很明确的学习方向。 所以直接…

杀手级的AI LLM产品还有多久面世

AI产品落地:Killer App依然缺席的原因与未来展望 🚀 在当今科技领域,人工智能(AI)无疑正处于一个快速发展的阶段。尽管如此,关于AI产品的实际应用和市场落地,仍然存在诸多挑战。本文将探讨当前…

使用 Matplotlib 绘制折线图

使用 Matplotlib 绘制折线图 数据可视化是数据分析的重要组成部分,通过图表,我们可以更直观地理解数据背后的趋势和模式。Matplotlib 是 Python 最基础也是最常用的绘图库之一,非常适合初学者。本文将带你从零开始,逐步创建和自定…

Python Static Typing: 提升代码可靠性与可读性的使用技巧

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…

Java毕业设计 基于SSM和Vue的酒店管理系统小程序

Java毕业设计 基于SSM和Vue的酒店管理系统小程序 这篇博文将介绍一个基于SSM框架和Vue开发的酒店管理系统微信小程序,适合用于Java毕业设计。 功能介绍 用户 登录 注册 忘记密码 首页 图片轮播 房间信息 房间详情 预订 收藏 评论 我的 订单信息 酒店管理…

Python 常用内置函数

目录 1、enumerate函数 1.1、for循环中使用 1.2、enumerate指定索引的起始值 1.3、enumerate在线程中的作用 2、Map 函数 2.1、map()函数可以传多个迭代器对象 3、lambda表达式(匿名函数) 示例 4、sort函数和sorted函数 4.1、sort()函数 4.2、…

vue2学习 -- vuex

文章目录 1. 理解2. 语法2.1 安装使用2.2 getters配置项2.3 四个map方法的使用2.4 vuex模块化 1. 理解 概念:专门在ue中实现集中式状态(数据)管理的一个ue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写&…

Java基础 1. Java开发环境搭建

Java基础 1. Java开发环境搭建 文章目录 Java基础 1. Java开发环境搭建1.1. 常用的DOS命令1.1.1. 常用的Windows组合键:1.1.2. 常用的DOS命令:1.1.3. 批处理文件 1.2. 通用文本编辑快捷键1.2.1. Sublime Text文本编辑器的安装与使用安装中英文打开方式调整字体大小文件扩展名 1…

LlamaIndex 如何可视化跟踪日志

LlamaIndex 中无论是 RAG 还是 Agent,都是需要和 LLM 进行交互,在这个流程流中包括搜索、Retrieve和推理等多个阶段。提示词在整个流程通过模板进行控制,LlamaIndex 通过整合和调度完成最终任务。 大模型的一个最大特点就是无法保证回答百分…

假如有一个嵌套集合,怎么通过stream流将集合放到一个集合之中?

假如有一个嵌套集合,怎么通过stream流将集合放到一个集合之中? 问题解释:你有一个嵌套的集合,想要通过 Stream 流的方式将其中嵌套的集合放到一个新的集合中。可以使用 flatMap 方法来实现。这种方法非常适合处理嵌套集合的情况。…

2个方法教你如何删除ZIP压缩包密码

zip压缩包设置了加密密码,每次解压文件都需要输入密码才能够顺利解压出文件,当压缩包文件不再需要加密的时候,大家肯定想删除压缩包密码,或是忘记了压缩包密码,想要通过删除操作将压缩包密码删除,就能够顺利…