proc源码解析(二)--proc数据结构
2013-10-22 08:36
537 查看
上节主要说明了proc下的内容,从本节开始解析proc的实现。与普通文件系统一样,proc当然需要虚拟文件系统的支持,所以它必须具备文件系统的几个主要的数据结构。
1.proc_dir_entry
在proc文件系统中,每个entry的实例是由proc_dir_entry来描述的,其结构如下:
大部分元素根据其名字就知道表达的意思。需要注意的get_info,read_proc,write_proc三个接口。
get_info:当用户向proc文件读取的数据小于一个页面大小时,可以使用这个函数向用户返回数据。
read_proc_t *read_proc 和write_proc_t *write_proc:这两个函数提供了对proc文件进行操作的简单接口。我们知道,对于proc文件,我们可以从中读取核心数据,还可以向其中写入数据,因此,对于一些功能比较简单的proc文件,我们只要实现这两个函数(或其中之一)即可,而不用设置inode_operations结构,这样, 整个操作比较简单。实际上,我们会在后面的分析中看到,在注册proc文件的时候,会自动为proc_fops设置一个缺省的 file_operations结构,如果我们只实现了上面提到的两个读写操作,而没有设置自己file_operations结构,那么,会由缺省的
inode_operations结构中的读写函数检查调用这两个函数。
2.proc inodes
内核中提供了一个名为proc_inode的结构来描述proc文件系统的inode结构。该结构如下:
<proc_fs.h>
union proc_op {
int (*proc_get_link)(struct inode *, struct dentry **,
struct vfsmount **);
int (*proc_read)(struct task_struct *task, char *page);
};
struct proc_inode {
struct pid *pid;
int fd;
union proc_op op;
struct proc_dir_entry *pde;
struct inode vfs_inode;
};
proc_inode的作用是建立proc的数据与VFS层之间的联系。
在该结构中,有几个比较诡异的地方,首先是最后一个域是struct inode vfs_inode,
一般情况下一个结构要建立与另外一个结构的链接,只需一个指向另外一个结构的实例的指针,而此处确实一个结构实例。也就是说proc_inode结构的一个实例形式如下:
在linux中可以使用container机制获取proc_inode结构,这是由一个函数完成的。
<proc_fs.h>
static inline struct proc_inode *PROC_I(const struct inode *inode)
{
return container_of(inode, struct proc_inode, vfs_inode);
}
proc_get_link 和 proc_read函数在一个union的原因是,在同一时间内只可能使用一个函数。proc_read用来获取进程相关的信息,proc_get_link用来创建指向VFS文件系统中与进程相关的数据的链接。
以上元素的用法和具体含义到后边与进程相关的信息一节还会详细解释。
原文转自:/article/9147194.html
1.proc_dir_entry
在proc文件系统中,每个entry的实例是由proc_dir_entry来描述的,其结构如下:
<proc_fs.h> struct proc_dir_entry { unsigned int low_ino; //inode号 unsigned short namelen; const char *name; mode_t mode; nlink_t nlink;//子目录和软链接的数目 uid_t uid; gid_t gid; loff_t size; const 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 */ kdev_t rdev; };
大部分元素根据其名字就知道表达的意思。需要注意的get_info,read_proc,write_proc三个接口。
get_info:当用户向proc文件读取的数据小于一个页面大小时,可以使用这个函数向用户返回数据。
read_proc_t *read_proc 和write_proc_t *write_proc:这两个函数提供了对proc文件进行操作的简单接口。我们知道,对于proc文件,我们可以从中读取核心数据,还可以向其中写入数据,因此,对于一些功能比较简单的proc文件,我们只要实现这两个函数(或其中之一)即可,而不用设置inode_operations结构,这样, 整个操作比较简单。实际上,我们会在后面的分析中看到,在注册proc文件的时候,会自动为proc_fops设置一个缺省的 file_operations结构,如果我们只实现了上面提到的两个读写操作,而没有设置自己file_operations结构,那么,会由缺省的
inode_operations结构中的读写函数检查调用这两个函数。
2.proc inodes
内核中提供了一个名为proc_inode的结构来描述proc文件系统的inode结构。该结构如下:
<proc_fs.h>
union proc_op {
int (*proc_get_link)(struct inode *, struct dentry **,
struct vfsmount **);
int (*proc_read)(struct task_struct *task, char *page);
};
struct proc_inode {
struct pid *pid;
int fd;
union proc_op op;
struct proc_dir_entry *pde;
struct inode vfs_inode;
};
proc_inode的作用是建立proc的数据与VFS层之间的联系。
在该结构中,有几个比较诡异的地方,首先是最后一个域是struct inode vfs_inode,
一般情况下一个结构要建立与另外一个结构的链接,只需一个指向另外一个结构的实例的指针,而此处确实一个结构实例。也就是说proc_inode结构的一个实例形式如下:
在linux中可以使用container机制获取proc_inode结构,这是由一个函数完成的。
<proc_fs.h>
static inline struct proc_inode *PROC_I(const struct inode *inode)
{
return container_of(inode, struct proc_inode, vfs_inode);
}
proc_get_link 和 proc_read函数在一个union的原因是,在同一时间内只可能使用一个函数。proc_read用来获取进程相关的信息,proc_get_link用来创建指向VFS文件系统中与进程相关的数据的链接。
以上元素的用法和具体含义到后边与进程相关的信息一节还会详细解释。
原文转自:/article/9147194.html
相关文章推荐
- 递归简论
- 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
- ElasticSearch的数据结构
- 《数据结构和Java集合框架第三版》读书笔记(一)递归
- 【数据结构之排序7】堆排序
- 【数据结构之排序6】直接选择排序
- 【数据结构之排序5】快速排序
- 【数据结构之排序4】冒泡排序
- 《数据结构和Java集合框架第三版》读书笔记(三)回溯算法
- 【数据结构之排序3】希尔排序
- 【数据结构之排序2】直接插入排序
- 【数据结构之排序1】排序的基本概念
- BloomFilter——大规模数据处理利器
- 数据结构-深入浅出细谈八大排序
- oracle技术之理解锁和闩(1)与锁相关的数据结构
- 《数据结构和Java集合框架第三版》读书笔记(二)——二分法检索
- 《数据结构和Java集合框架第三版》读书笔记(零)——数组、类、集合
- 数据、数据结构
- ECMA167 - Volume数据结构
- 数据结构全攻略--二叉树胡子眉毛一把抓