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文件系统中与进程相关的数据的链接。
以上元素的用法和具体含义到后边与进程相关的信息一节还会详细解释。