proc源码解析(二)--proc数据结构

   上节主要说明了proc下的内容,从本节开始解析proc的实现。与普通文件系统一样,proc当然需要虚拟文件系统的支持,所以它必须具备文件系统的几个主要的数据结构。

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


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值