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,是为了构建父节点和子节点的关系

struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,                        struct proc_dir_entry *parent)   {       struct proc_dir_entry *ent;       nlink_t nlink;          if (S_ISDIR(mode)) {           if ((mode & S_IALLUGO) == 0)               mode |= S_IRUGO | S_IXUGO;           nlink = 2;       } else {           if ((mode & S_IFMT) == 0)               mode |= S_IFREG;           if ((mode & S_IALLUGO) == 0)               mode |= S_IRUGO;           nlink = 1;       }          ent = proc_create(&parent,name,mode,nlink);       if (ent) {           if (S_ISDIR(mode)) {               ent->proc_fops = &proc_dir_operations;               ent->proc_iops = &proc_dir_inode_operations;           }           if (proc_register(parent, ent) < 0) {               kfree(ent);               ent = NULL;           }       }       return ent;   }  

在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


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/22868.html