`

Linux proc 的文件系统的源码分析

 
阅读更多

proc 的文件系统是linux 里面常用的基于内存的文件系统。linux的内核版本 2.6.18

重要的struct:

struct proc_dir_entry {
unsigned int low_ino;
unsigned short namelen;
const char *name;
mode_t mode;
nlink_t nlink;
uid_t uid;
gid_t gid;
loff_t size;
struct inode_operations * proc_iops;
const struct file_operations * proc_fops;
get_info_t *get_info;
struct module *owner;
struct proc_dir_entry *next, *parent, *subdir;
void *data;
read_proc_t *read_proc;
write_proc_t *write_proc;
atomic_t count;/* use count */
int deleted; /* delete flag */
void *set;
};

其中3个核心的函数指针

const struct file_operations * proc_fops; 当文件系统操作proc文件系统的时候,read,write,open所调用的函数

proc 文件系统同时定义了默认的proc file operations的时候

static struct file_operations proc_file_operations = {
.llseek = proc_file_lseek,
.read = proc_file_read,
.write = proc_file_write,
};

在使用默认的proc file operations 的时候,需要定义自己的read_proc/write_proc的函数

read_proc_t *read_proc; 写自己的read的函数

write_proc_t *write_proc; 写自己的write的函数


1.初始化

在Main.c里面调用了 root.c 里的函数 proc_root_init(); 初始化了一些基本的proc目录下的文件,例如 cpuinfo, stat....


2.创建proc文件

a . struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent)

参数 name 是要创建的 proc 文件名。

mode 是该entry性质,例如DIR(目录)/LNK(链接)/REG(文件)

parent 指定该文件的上层 proc 目录项,如果为 NULL,表示创建在 /proc 根目录下。

在create_proc_entry函数里会设置文件的名字,文件的权限,传入上层的proc_dir_entry,是为了构建父节点和子节点的关系


在proc_register方法里面会改变父子的proc_dir_entry链表指向构建父和子的树状结构,也就是struct proc_dir_entry *next, *parent, *subdir;

dp->next = dir->subdir;
dp->parent = dir;
dir->subdir = dp;

同时也指定了默认的const struct file_operations * proc_fops,为proc_file_operations


b.static inline struct proc_dir_entry *create_proc_read_entry(const char *name,
mode_t mode, struct proc_dir_entry *base,
read_proc_t *read_proc, void * data)

创建函数体传进的指定的read proc文件的方法read_proc_t *read_proc;

实际上这个函数存在的意义不是很大,直接可以使用create_proc_entry来替代,在多做一件事情,就是指定proc_dir_entr->read_proc=read_proc;


如果不想默认的proc file 的操作函数,你也可以自己指定自己的操作函数,只要用create_proc_entry返回的proc_dir_entry结构体里直接指定proc_fops指针指向自己的定义的结构体,就可以了

比如:

static struct file_operations proc_my_operations = {
.open = my_open,
.read = my_read,

.write = my_write
.llseek = my_lseek,
.release = my_release,
};


/proc/stat /proc/interrupts ... 显示系统运行状态的设计技巧

象stat,interrupts 的这样反应系统状态的文件,

首先系统的状态实际上都是已经在系统的内存中,

其次如果没有别的进程对该文件监视,是不需要往这个文件里写内容的

哪怕在时间中断中去写这个文件(内存的一次复制),也是没有必要的,第一有系统的开销,第二没有人关注它,第三不可控性

所以对于系统状态的监听,应该是由外部(想监听的系统)来触发的,不需要内核时时刻刻去写系统状态文件,那么这样的设计就很简单了,内核只要在open的函数里去写当时的状态就足够了。

也就是对外部系统按照自己的频率去打开这个文件,内核复制状态到proc文件中,然后进程读出内容到自己的用户空间,然后关闭这个文件。关闭这个动作就非常重要,如果不关闭,那么里面的内容将不会在跟新。



分享到:
评论

相关推荐

    第18章 proc文件系统1

    4. **中断编号信息**:`/proc/interrupts`提供了关于中断源及其中断向量的详细列表,这对于分析系统中断问题非常有用。 5. **模块信息**:`/proc/modules`列出了已加载的内核模块,`/proc/kallsyms`包含了内核符号...

    Linux操作系统实验教程源码.zip

    在这里,可能包含的是对proc文件系统的操作和分析,例如读取系统信息、监控进程状态、查看网络统计等。学习proc文件系统有助于理解Linux系统是如何管理和呈现其内部状态的。 3. **内核模块.rar**:内核模块是Linux...

    Linux 系统top源码包

    1. **数据采集**:源码会展示`top`是如何通过系统调用来获取实时的系统状态信息,如`/proc`文件系统中的信息。 2. **进程调度**:`top`如何对进程进行排序,以及如何根据不同的参数(如CPU使用率、内存使用量等)...

    linux ps命令源码

    源码分析可以帮助我们深入理解`ps`命令的工作原理,以及如何在底层与系统交互。 `ps`命令的工作基于/proc文件系统,这是一个虚拟文件系统,它提供了关于内核、进程、硬件状态等信息的接口。当执行`ps`时,它实际上...

    Linux系统命令top,ps,kill,free,vmstat等命令的源码

    它的源码可能涉及如何收集和解读`/proc/vmstat`、`/proc/stat`等文件的数据,以展示系统活动和资源利用率。 通过研究这些命令的源码,不仅可以帮助我们理解Linux系统的工作机制,还能提高我们调试和优化系统性能的...

    Linux进程-zhangwl.rar_linux_linux 进程_linux进程_源码分析_进程 linux

    在Linux源码分析方面,我们可以深入到kernel/proc目录下的源码,研究如何实现进程的创建、调度和管理。例如,进程描述符(task_struct)结构体包含了进程的所有信息,而在do_fork()函数中可以看到完整的进程复制流程...

    proc数据库到文件和文件到数据库

    源码分析通常包括以下步骤: - 了解代码结构:识别主要的函数或方法,了解它们的功能。 - 数据库连接:查找代码中建立数据库连接的部分,这通常涉及到数据库驱动和连接字符串。 - SQL操作:找出执行SELECT、INSERT等...

    在LINUX制作文件系统.cramfs .jffs2

    在Linux环境中制作`.cramfs`和`.jffs2`两种格式的文件系统,主要应用于嵌入式系统,以创建轻量级、高效的启动媒介。`.cramfs`(Compressed ROM File System)和`.jffs2`(Journal Flash File System 2)都是针对闪存...

    linux2.6.9poll系统调用源码分析参照.pdf

    2. **函数源码分析**: - `sys_poll`:这是`poll`系统调用的入口点。首先,它检查用户提供的文件描述符数量是否超出限制。接着,如果提供了超时时间,将其转换为内核可以理解的格式。然后,初始化`poll_wqueues`...

    linux-selinux功能及源码分析

    本书《linux-selinux功能及源码分析》深入探讨了SELinux的核心概念和技术细节,对于想要深入了解SELinux工作原理的专业人士来说是一本不可多得的资源。 #### 操作系统中访问控制模型的演化 - **1.1 访问控制模型的...

    linux2.6.9poll系统调用源码分析参考.pdf

    2. **函数源码分析**: - `sys_poll` 是 `poll` 系统调用的入口点,它接收用户空间的 `pollfd` 数组、数量和超时时间作为参数。 - 首先检查 `nfds` 是否超过最大句柄数,如果超过则返回错误。 - 如果 `timeout` ...

    linux内核源代码情景分析

    5.8 特殊文件系统/proc 第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于...

    Linux 文件系统制作

    在Linux系统中,文件系统是组织和存储数据的基础架构,对于任何操作系统来说,理解如何创建和定制文件系统都是至关重要的。在本篇中,我们将详细探讨如何在Linux环境下制作文件系统,特别是涉及到裁剪和编译BusyBox...

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    ### Linux内核源代码情景分析知识点总结 #### 第1章 预备知识 - **1.1 Linux内核简介** - Linux是由Linus Torvalds在1991年开始开发的操作系统内核,其设计思想受到Unix的影响,但并不直接继承Unix的任何代码。 -...

    Linux 2.6内核设备模型分析

    sysfs文件系统是Linux内核用来展现系统设备信息的一种特殊文件系统,与proc文件系统类似但功能更为专精。它负责将系统中所有的设备组织成树状结构,便于用户空间程序访问内核数据结构的详细信息。sysfs文件系统的...

    linux网络协议栈源码实现

    在Linux中,路由信息存储在`/proc/sys/net/route`目录下,`route`命令通过读写这些文件来添加、删除或显示路由。源码中,`route.c`文件包含了这些操作的实现。这些操作最终会调用内核中的`ip_route_add()`、`ip_...

    linux 0.11源码

    5. **文件系统**:Linux 0.11支持的文件系统主要是FAT(文件分配表),相关代码在`fs/fat.c`。源码解释了如何读写文件、创建和删除目录等操作,对理解文件系统的工作原理大有裨益。 6. **系统调用**:Linux 0.11...

    重点linux源码分析.pdf

    在《重点Linux源码分析》中,我们探讨的是Linux内核的源代码,这个核心是用GNU的C语言编写的。GNU C语言不仅遵循ANSI C标准,还包含了一些扩展和特殊技巧,这些可能会对初次接触内核源码的读者造成一定的困扰。此书...

Global site tag (gtag.js) - Google Analytics