proc文件系统------《深入理解Linux内核架构》笔记

Linux内核实验(一):proc文件系统 一、引言Proc文件系统,以文件系统的形式向用户提供系统当前状态,动态地从同内核中读出所需的信息,只存在内存中,不占用外存空间。二、实验内容问题A: 1、cpu类型 2、内核版本问题B: 1、系统启动以来的时间,以dd:hh:mm:ss报告问题C: 1、cpu执行用户态、系统态、空闲态所用时间 2、多少次磁盘请求 3、多少次上下文切换 4、启动了多少次进程问题D: 1、内存总量 2 阅读详情

proc文件系统

1. proc简介(Process Data System, 进程数据系统)

proc文件系统属于虚拟文件系统,即该文件系统的数据,由内核动态生成,并不会存放在持久存储数据中。

proc文件系统,使得内核可以生成与系统状态和配置有关的信息。该信息可以由用户和系统程序从普通文件读取,而无需专门的工具与内核通信。比如可以通过cat status打印进程的状态信息,如下:

daniel@daniel-HP-ProBook-4411s:/proc/self$ cat status
Name:	bash
State:	S (sleeping)
Tgid:	5797
Pid:	5797
PPid:	4378
TracerPid:	0
Uid:	1000	1000	1000	1000
Gid:	1000	1000	1000	1000
FDSize:	256
......

从内核开发趋势来看,正在远离用proc文件系统提供的信息,而倾向于采用特定与问题的虚拟文件系统来导出数据。一个很好的例子就是USB文件系统,将与USB子系统有关的许多状态信息导出到用户空间,而没有给proc增加新的负担。但这并不意味这,proc文件系统变的多余,当今,/proc依旧重要,不仅在安装新的发布版时,而且也用于支持(自动化的)系统管理。

proc文件系统主要有如下几个主要功能:

a. 用于查看进程的数据信息,别忘了proc的全称为process data system

b. 查看与特定的内核子系统无关的一般信息,如/proc/iomem, /proc/ioports, /proc/interrupts

c. 查看网络信息,/proc/net子目录提供了内核的各种网络选项的有关数据。

d. 查看和修改系统控制参数,由/proc/sys子目录提供。例,可以通过cat /proc/sys/vm/swappiness 查看交换算法在换出页时的积极程度。

2. proc的数据结构

与Ext2一样,proc大量使用了VFS数据结构,因为作为一种文件系统,它必须集成到内核的VFS抽象层中。但,毕竟proc只是用于获取内核的数据为主要目的,所以在其设计的过程中,遵循简单实用的特性,较Ext2简单。


图1-1 底层为proc的VFS结构

图1-1中绿色方框的部分为proc实现的部分,proc中文件的大小为0,所以inode中的i_mapping并没有使用,值为NULL。proc_dir_entry用于表示一个proc文件系统中的目录,通过proc_mkdir创建,目录之间的树形结构通过proc_dir_entry中的*next, *parent, *subdir维护。图1-1中所涉及的结构体请参考书中的第8, 10章和Linux内核源代码。

以下以查询一个目录为例(主要涉及path_lookup函数,查找过程与VFS与Ext2文件系统一致),得益于VFS文件系统,proc文件系统只需要自定义实现lookup接口。因为查找过程将在一定时间到达real_lookup,该函数将通过调用dentry->i_op->lookup实现。

dentry->i_op->lookup,对于/proc文件,为proc_root_lookup;对于/proc目录一下的非PID目录,为proc_lookup;对于/proc下的PID目录,为proc_tgid_base_operations。

// proc_root_lookup函数的主要功能
static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentry, 
  struct nameidata *nd)
{
  	if (!proc_lookup(dir, dentry, nd)) {//顺序扫描指定路径的各个分量
  		return NULL;
  	}
  	
  //需要扫描的目录为一个pid目录,而该pid目录的proc_dir_entry还没有创建。
  	return proc_pid_lookup(dir, dentry, nd); // 查找指定pid目录下的目录或文件
  }
}

// proc_lookup 函数,PDE主要是由container_of机制实现的
struct dentry *proc_lookup(struct inode *dir, struct dentry *dentry, 
  struct nameidata *nd)
{
	return proc_lookup_de(PDE(dir), dir, dentry);
}

/*
 * Don't create negative dentries here, return -ENOENT by hand
 * instead.
 */
struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *dir, 
  struct dentry *dentry)
{
	struct inode *inode = NULL;
	int error = -ENOENT;

	spin_lock(&proc_subdir_lock);
	for (de = de->subdir; de ; de = de->next) { //遍历de下面的所有路径分量
		if (de->namelen != dentry->d_name.len)
			continue;
		if (!memcmp(dentry->d_name.name, de->name, de->namelen)) {
			unsigned int ino;

			ino = de->low_ino;
			de_get(de);
			spin_unlock(&proc_subdir_lock);
			error = -EINVAL;
			inode = proc_get_inode(dir->i_sb, ino, de); // 查找成功,创建proc_dir_entry *de对应的proc_inode, 并返回&(proc_inode.vfs_inode)。注意inode的inode_operations初始化为de->proc_iops。
			goto out_unlock;
		}
	}
	spin_unlock(&proc_subdir_lock);
out_unlock:

	if (inode) {
		dentry->d_op = &proc_dentry_operations;
		d_add(dentry, inode); // 将新初始化的dentry加入dentry缓存
		return NULL;
	}
	if (de)
		de_put(de);
	return ERR_PTR(error);
}

struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, 
  struct nameidata *nd)
{
	struct dentry *result = ERR_PTR(-ENOENT);
	struct task_struct *task;
	unsigned tgid;
	struct pid_namespace *ns;

	result = proc_base_lookup(dir, dentry); // if (dentry->d_name== self) 创建self的inode
	if (!IS_ERR(result) || PTR_ERR(result) != -ENOENT)
		goto out;

	tgid = name_to_int(dentry); //将字符串转换为unsigned int
	if (tgid == ~0U)
		goto out;

	ns = dentry->d_sb->s_fs_info;
	rcu_read_lock();
	task = find_task_by_pid_ns(tgid, ns); // 查找对应pid对应的task_struct
	if (task)
		get_task_struct(task); // 使用计数加1 
	rcu_read_unlock();
	if (!task)
		goto out;

	result = proc_pid_instantiate(dir, dentry, task, NULL);// 为该pid目录创建inode和dentry,注意inode的inode_operations初始化为proc_tgid_base_inode_operations。
	put_task_struct(task);
out:
	return result;
}


内核窗口---proc文件系统 内核窗口—proc文件系统 引言:在写进程调度笔记时,我特别好奇,想了解一下ubuntu 14.04到底采取的是什么调度策略,于是接触到proc文件系统,它内部包含很多内核数据信息。这里并不会分析每一个文件、每一条数据的含义。仅仅是介绍Proc文件系统产生背景,常见文件含义。以后遇到相关问题时,再深入学习。 内核窗口—proc文件系统 一、Proc文件系统简单介绍 1.1、产生背景 1.... 阅读详情

相关推荐

深入理解Linux proc文件系统

和为管理员提供了强大的工具来管理和监控系统进程。通过这些接口,可以获取进程的详细信息、状态和资源使用情况,从而有效地进行进程管理、性能监控和故障排查。这一章节详细介绍了如何利用这些接口进行系统监控和进程管理,确保系统的健康和稳定性。

weixin_42613018的博客 1235

Linux proc_mkdir和proc_create的用法

//功能:在proc中创建一个文件夹 //参数1:创建的文件夹名称 //参数2:创建的文件夹路径,就是在哪个文件夹中创建,如果是proc根目录,此参数为NULL //返回值:创建的文件夹路径 struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent); //功能:在proc中创...

weixin_30381793的博客 2225

114.Android简单的动态切换app的图标,两种方式

- 默认的图标-->-- 需要切换的图标-->android:label="短信"-- 默认activity-->

曹二少的博客 5574

proc_mkdir与proc_create

1:创建proc文件夹 struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent); 参数1:name就是要创建的文件夹名称。 参数2:parent是要创建节点的父节点。也就是要在哪个文件夹之下创建新文件夹,需要将那个文件夹的              proc_dir_entry

ma111000522的博客 1万+

西门子机床数据采集实战:从828D到840DSL的CNC设备联网与实时监控

本文深入探讨了西门子机床数据采集的实战方案,重点解析了从828D到840DSL等CNC设备如何实现免授权、低成本联网与实时监控。文章通过对比不同型号系统的数据接口差异,提供了详细的配置步骤、核心数据点清单以及避坑指南,旨在帮助工厂技术人员经济高效地挖掘机床数据价值,提升生产管理效率。

weixin_29181861的博客 1331

单细胞分析实战:用R语言绘制带连线的堆叠柱状图(附完整代码)

本文详细介绍了如何使用R语言绘制带连线的堆叠柱状图进行单细胞转录组数据分析,特别适用于展示细胞比例变化趋势。通过完整代码示例和实战技巧,帮助研究者优化多组别比较的可视化效果,提升科研图表质量。

yhn4567890的博客 390

开发中proc文件系统的简单使用

在Linux系统中, “/proc”文件系统十分有用, 它被内核用于向用户导出信息。“/proc”文件系统是一个虚拟文件系统, 通过它可以在Linux内核空间和用户空间之间进行通信。在/proc文件系统中, 我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段, 与普通文件不同的是, 这些虚拟文件的内容都是动态创建的。“/proc”下的绝大多数文件是只读的, 以显示内核信息为主。

weixin_52849254的博客 1709

把STM32MP135当单片机玩:实战SD卡脱机运行LED程序(基于MP135DK开发板)

本文详细介绍了如何在STM32MP135开发板上实现SD卡脱机运行LED程序,通过裸机开发方式(Bare Metal)利用HAL库完成GPIO控制,并解析了SD卡启动流程。内容涵盖工程创建、代码编写、SD卡烧录及常见问题排查,为开发者提供了一种高性能单片机开发方案。

weixin_33734785的博客 242

Linux 驱动创建Proc文件系统接口

目录 它有什么作用呢? 如何实现? Linux的procfs文件系统是一个虚拟文件系统,Linux不只有一个虚拟文件系统,sysfs和debugfs也是虚拟文件系统,sysfs在procfs的基础上进行了优化。虚拟文件系统在系统运行时创建,存在于内存。 它有什么作用呢? 它是一种在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。...

ctgulvzhaole的博客 1220

Linux 隐藏进程

这种方式属于DKoM(Direct Kernel Object Manipulation)攻击方式了,即直接内核对象操作技术。关于第一种hook方式可以参考上一篇文章。最后推荐一个rootkit工具。

chi's blog 2051

别再只会复制Haar级联代码了!OpenCV人脸检测全方案深度解析,从原理到工业级落地

通用预训练模型在你的业务场景效果不好时,用自己的业务数据集训练专属的级联器,是提升精度的终极方案,OpenCV自带和工具,支持自定义Haar/LBP级联器训练。场景首选方案次选方案新手入门学习Haar级联分类器LBP级联分类器嵌入式轻量固定场景LBP级联分类器YuNet轻量版工业级落地项目(99%场景)DNN+YuNetMTCNN多人脸+小目标复杂场景DNN+YuNet自定义微调模型同时做人脸+其他目标检测。

2601_94871597的博客 380

linux proc文件系统使用之单次读

一、proc文件系统 proc文件系统是一种无存储的文件系统,当读其中的文件时,其内容动态生成,当写文件时,文件所关联的写函数被调用。上面说文件关联的读写函数,其实就是在创建对应proc 文件的驱动中实现的。当proc文件时,就相当于调用了,对应驱动的read函数。这里我们不研究proc的实现原理,我也没那么多时间,这里就先会用,后面在来研究它的实现原理吧。感兴趣的话,可以参考博文。 二、几个

armwind的专栏 2227

安装keil软件时安装不了芯片包怎么回事?芯片包安装路径放在Keill里的packs下面,弹框提示报错:Errors retumned from cpackget...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2207

Linux - 深入理解/proc虚拟文件系统:从基础到高级

通过读取/proc/stat和/proc/loadavg等文件,可以获取CPU使用情况和系统负载信息,这对于性能监控和容量规划非常有用。虚拟内存管理是系统性能优化的重要方面,通过监控/proc/vmstat文件,可以了解系统的虚拟内存使用情况,并进行相应的调优。监控系统的CPU使用情况是系统管理员的常见任务,通过读取/proc/stat文件,可以获取每个CPU的使用情况。/proc/sys/fs/file-nr文件可以用于监控系统中文件句柄的使用情况,以防止文件句柄耗尽的问题。

小工匠 8836

西安交通大学软件学院——分布式系统练习题(综合题)

摘要:本文探讨了分布式系统的核心特性与关键问题。首先阐述了分布式系统的8种透明性特性,包括访问、定位、迁移等。然后通过具体案例分析了分布式事务的回滚机制、域名解析的迭代与递归过程、不同分布式系统的异同比较。重点讨论了RPC通信中客户端/服务器崩溃的处理方法,包括消灭、再生和到期三种策略。最后介绍了Lamport时间戳算法在进程通信中的应用及问题解决方案。全文涵盖了分布式系统设计中的透明性、可靠性、一致性等核心问题。

qq_73044452的博客 204

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【操作系统】探究文件系统奥秘:创建proc文件系统的解密与实战

作者深入研究了创建proc文件系统的关键内容。首先,文章解析了proc文件系统的基本概念,强调了其在内核中的实现方式和功能。其次,深入讨论了创建和管理proc文件系统的接口,涉及内核模块的编写以及与之相关的注册、注销和回调函数。

朝花夕拾 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入理解linux系统下proc文件系统内容

另外,可以参考这个http://www.centos.org/docs/5/html/5.1/Deployment_Guide/ch-proc.html 内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统。 Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),...

流水mpc 470

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux编写内核模块,实现在/proc目录下添加文件

/proc是Linux上的一种虚拟文件系统,存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以更改其中某些文件来改变内核的运行状态。 现编写一个内核模块,在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world。 实验环境 Ubuntu 18.04.1,源码内核版本:Li...

对LLM,AI应用有深厚兴趣,研究方向NLP。connect me by DeSaintamore_ 7303

内核proc文件系统与seq接口----内核proc文件系统编程接口

所有要使用 proc的内核模块都应当包含 头文件。首先要了解以下proc编程中最重要的数据结构: struct proc_dir_entry { unsigned int low_ino; unsigned int namelen; const char *name; // 入口文件名 mode_t mode; // 文件访问权限模式 nlink_t nl

2007

【操作系统】实验八:添加/proc文件系统

本文主要是介绍了操作系统实验八,即添加/proc文件系统,属于操作系统专栏

superiony的博客 1220

Linux虚拟文件系统/proc介绍-第二部分

记录的是进程的安全标签和对象创建策略,主要作用是让 Linux 安全模块能基于“上下文”进行 强制访问控制(MAC),保证进程只能做被策略允许的事情.

weixin_42059145的博客 928

深入理解proc文件系统

概述:linux 内核提供了一种获取其内部数据结构和在系统运行时改变内核参数设置的方法,这种方法就是凭借proc文件系统。 1.proc ——一个虚拟文件系统 proc文件系统用来提供给内核和内核模块发送消息给进程,之所以说它是虚拟的文件系统,是因为1)虚拟是指的是它没有对应具体的存储介质,比如磁盘;2)文件系统指的是它的确实现了必须的文件系统接口。可以通过如下命令查询: $

河西无名式 1942

Linux中/proc目录下文件详解 /proc/devices文件 /proc/modules文件

原来对linux系统中的/proc目录不是很了解,只知道可以查看cpu,内存等相关的信息,后来一个朋友问我/proc目录的一些内容,还真没有答上来,于是搜索下资料,找到一篇不错的文章,学习了! 转载如下: Linux中/proc目录下文件详解(一) /proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。可以使用的文件随系统配置的变化而变化。命令p...

EmbeddedCoder 的优快云博客 1905
上一篇: VFS与Ext2文件系统------《深入Linux内核架构》笔记
下一篇: fatal: Could not read from remote repository
wong_daniel
博客等级 码龄19年 37粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值