`

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文件中,然后进程读出内容到自己的用户空间,然后关闭这个文件。关闭这个动作就非常重要,如果不关闭,那么里面的内容将不会在跟新。



分享到:
评论

相关推荐

    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章基于...

    wireshark源码

    wireshark源码分析问题这几天在看wireshark(ethereal)源代码。看源代码的主要兴趣点是它的分析模块(dissect)。分析之后他的数据存在哪儿,怎么打印的(-V参数)。我想把分析后的数据,提取出来,存在自己定义的...

    基于Linux的内核信息追踪方法研究

    围绕内核信息捕获和内核信息存储这两项内容,陈燕晖,李清干和张磊等提出基于内核调试的捕获方法[6][7][8],牛峰、李东亮等提出基于内核日志、Proc文件系统等通信方法[9][10]。本文对比分析了这些方法的特点,指出了...

    Linux-Insight:Linux内核源码认知层,承上启下的分析

    内核模块分析框架 duanery 2019年1月23日 Linux爱好者 核心原理简介 1使用方法 用户态的用法 内核态的用法 2编译 发现模块是如何编译的(如果有的话) 3初始化 模块的初始化入口,以及初始化阶段...proc文件系统接口,

    基于mediastreamer2的网络电话实现流程以及源码库

    首先接到这一个项目,说是要用mediastreamer2做一个网络电话。之前也是从来没有接触过。于是首先开始在百度中搜索一下需要哪些东西,以及...分析::找不到arm-linux-gnueabi/python2.7/pyconfig.h这文件。那就继续交叉...

    redhat linux教材20课程学习文档

    10.5 proc文件系统 10.6 SWAP 10.7 NFS 10.8 RAID 10.9 LVM 第十一章 文件与数据备份 11.1 为什么要备份? 11.2 备份什么? 11.3 备份策略 11.4 备份命令的选择 11.4.1 tar 的使用 11.4.2 gzip和compress ...

    linux.chm文档

    cat /proc/mounts 显示已加载的文件系统 lspci -tv 罗列 PCI 设备 lsusb -tv 显示 USB 设备 date 显示系统日期 cal 2007 显示2007年的日历表 date 041217002007.00 设置日期和时间 - 月日时分年.秒 clock -w ...

    LINUX系统开发技术详解---基于ARM

    9 2.1.2 ARM处理器体系结构........................................................................................ 10 2.1.3 Linux 与ARM处理器.....3.6.2 Linux 系统调用.........................................

    mini2440国嵌视频教程+课件+工具+软件+镜像+教程源码下载地址

    -国嵌内核驱动进阶班-5-4(Proc文件系统).avi -国嵌内核驱动进阶班-5-5(内核异常分析).avi -国嵌内核驱动进阶班-5-6(必修实验).avi -第6天(简单字符设备驱动程序设计) -国嵌内核驱动进阶班-6-1(LINUX驱动...

    Linux高级bash编程

    分析一个系统脚本 14. 命令替换 15. 算术扩展 16. I/O 重定向 16.1. 使用exec 16.2. 代码块的重定向 16.3. 应用 17. Here Documents 17.1. Here Strings 18. 休息时间 Part 4. 高级 19. 正则...

    Shell脚本专家指南

    主要内容包括如何使小到中型的系统管理任务自动化,分析系统数据并编辑配置文件,使用bash和ksh等编写IAnux、Unix和OSX应用程序的脚本文件等。 《Shell脚本专家指南》面向中高级的shell程序员,以及需要解决日常问题...

    uboott移植实验手册及技术文档

    4、交叉编译器 arm-softfloat-linux-gnu-gcc-3.4.5 【实验步骤】 一、建立自己的平台类型 (1)解压文件 #tar jxvf u-boot-1.3.1.tar.bz2 (2)进入 U-Boot源码目录 #cd u-boot-1.3.1 (3)创建自己的开发板...

Global site tag (gtag.js) - Google Analytics