Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96817
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-01 19:43
文章分类
文章存档

2017年(4)

2015年(24)

2014年(1)

我的朋友

分类: LINUX

2017-02-27 11:20:42

浅析/proc/sys/目录项inode节点方法集i_fop获得过程

1.创建/proc/sys目录
proc_root_init
==>proc_sys_init();
int proc_sys_init(void)
{
    proc_sys_root = proc_mkdir("sys", NULL); // 创建/proc/sys/目录,将de挂到/proc->subdir下面,以便proc_root_lookup使用,这里同时添加了 dp->low_ino唯一id号.
    proc_sys_root->proc_iops = &proc_sys_inode_operations; // 替换为自己的iops,这样"sys"目录项dentry对应的inode的i_fop就等于proc_sys_inode_operations
    proc_sys_root->proc_fops = &proc_sys_file_operations; // 替换为自己的iops
    proc_sys_root->nlink = 0;
    return 0;
}
static const struct inode_operations proc_sys_inode_operations = {
    .lookup = proc_sys_lookup, // 用来检查sys/目录下名为dentry->d_name.name的文件或目录是否存在,sys/目录下所有有文件都是来自 sysctl_head_next链表上的header->table元素,如果存在,调用proc_sys_make_inode()为其创建节点.
    .permission = proc_sys_permission,
    .setattr = proc_sys_setattr,
};
2.生成"sys"目录项对应的inode节点
// 对/proc/目录下所有目录﹑文件内容对应的dentry相配对的inode的生成都由下面的
// proc_root_inode_operations.proc_root_lookup完成
struct proc_dir_entry proc_root = {
    .low_ino = PROC_ROOT_INO,
    .namelen = 5,
    .name = "/proc",
    .mode = S_IFDIR | S_IRUGO | S_IXUGO,
    .nlink = 2,
    .count = ATOMIC_INIT(1),
    .proc_iops = &proc_root_inode_operations,
    .proc_fops = &proc_root_operations,
    .parent = &proc_root,
};
// 查询/proc目录下是否存在名为dentry->d_name.name的文件或目录[luther.gliethttp]
// 比如dentry->d_name.name等于"sys"
static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentry, struct nameidata *nd)
{
    if (!proc_lookup(dir, dentry, nd)) {
// "sys"在/proc/下存在,将为其创建节点inode = proc_get_inode(dir->i_sb, ino, de);
// 然后inode->i_fop = de->proc_fops;所以inode->i_fop方法集将为proc_sys_inode_operations
// 这样就可以执行proc_sys_lookup(),将ctl_table_header中的ctl_table们一一在/proc/sys/下面
// 显示出来了.
        return NULL; // 成功
    }

    return proc_pid_lookup(dir, dentry, nd);
}

阅读(2405) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~