免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: viton_xuan

VFS层拦截read/write file_operations函数无效 [复制链接]

论坛徽章:
0
发表于 2006-02-09 10:22 |显示全部楼层
原帖由 mq110 于 2006-2-9 09:47 发表
借个地儿 问个问题.

这样在VFS层拦截. 和自己导出syscall_table 然后修改系统调用然后替换有什么区别??
后者应该包含前者吧?


从sys_xxx拦截的话, 是比较高级别的, 以sys_open为例, 那时候还没有真正open, 我们只能通过操作文件名来做一些东西; VFS的话, 就是最底层的实现了, 这时候操作的是inode、dentry, 而不是文件名。

sys_read调用…调用…最终会走到VFS的open的

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-02-09 10:33 |显示全部楼层
原帖由 albcamus 于 2006-2-9 10:22 发表


从sys_xxx拦截的话, 是比较高级别的, 以sys_open为例, 那时候还没有真正open, 我们只能通过操作文件名来做一些东西; VFS的话, 就是最底层的实现了, 这时候操作的是inode、dentry, 而不是文件名。

...


明白了.多谢.

论坛徽章:
0
发表于 2006-02-09 10:49 |显示全部楼层
谢谢各位,再看了一下源码,发现正如albcamus大哥和richardhesidu大哥所说,文件和目录是不同的操作函数集。
在fs/ext3/inode.c:
ext3_read_inode() 有:
        if (S_ISREG(inode->i_mode)) {
                inode->i_op = &ext3_file_inode_operations;
                inode->i_fop = &ext3_file_operations;
                inode->i_mapping->a_ops = &ext3_aops;
        } else if (S_ISDIR(inode->i_mode)) {
                inode->i_op = &ext3_dir_inode_operations;
                inode->i_fop = &ext3_dir_operations;
        }
.....

另外觉得截获文件操作函数,用file->f_dentry->d_inode->i_fop和用file->f_op应该是一样的吧,因为看了一下
fs/open.c:
在filp_open()->dentry_open() 有:
inode = dentry->d_inode;
...
f->f_dentry = dentry;
...
f->f_op = fops_get(inode->i_fop);
在打开文件的时候file->f_op就应该和file->f_dentry->d_inode->i_fop指向同样的操作函数集了。

非常谢谢各位的帮助, 我先再试试, 如果有问题, 再麻烦各位。^_^

论坛徽章:
0
发表于 2006-02-09 11:08 |显示全部楼层

解释一下

原帖由 albcamus 于 2006-2-8 18:20 发表


有通用性的。 你可以把函数指针指向的地址大印出来, 跟System.map或者/proc/kallsyms比对一下, 就看到那个地址代表一个通用的函数了。



我的意思是说,filp->f_op仅属于“该文件”本身,而实际上,filp->f_dentry->d_inode->i_fop则会通过filp_open() > dentry_open() > fops_get()向下传递给目录里的文件(正如你所做的那样)。所以我推想,只要用你这种方法,对于non-regular file(比如“/”)也是可行的。right?

论坛徽章:
0
发表于 2006-02-09 11:20 |显示全部楼层
原帖由 treul 于 2006-2-9 11:08 发表



我的意思是说,filp->f_op仅属于“该文件”本身,而实际上,filp->f_dentry->d_inode->i_fop则会通过filp_open() > dentry_open() > fops_get()向下传递给目录里的文件(正如你所做的那样 ...


啊, 明白了^_^
BTW: 这个讨论真好, 一讨论大家都清楚了

论坛徽章:
0
发表于 2006-02-09 15:28 |显示全部楼层
to treul,

filp->f_op不属于该文件本身。在一个文件系统中它为不同文件公用。
在sys_open()中在


  1. f = filp_open(tmp, flags, mode);
  2. 后加入

  3. if(!IS_ERR(f)) printk("open %s  f_op = %p\n", tmp, f->f_op);

复制代码


就可以看出

论坛徽章:
0
发表于 2006-02-10 10:28 |显示全部楼层

回复 16楼 思一克 的帖子

re: 思一克

filp->f_op就是由其所属文件系统继承下来的(通过inode),不会传给下级。它是可定制的。所以偶称其“属于文件本身”。“在一个文件系统中它为不同文件公用”是一个现象,其本质就是第一句话。

论坛徽章:
0
发表于 2006-02-10 11:28 |显示全部楼层
我知道问题出在哪里了。struct file中的file_options函数指针是在file_open时,通过super_block中的file_operation获取的。如果不更改super_block里的file_operation,你是不可能替换成功的。

论坛徽章:
0
发表于 2006-02-10 13:07 |显示全部楼层
to wuhui_zsu :
如 思一克 和 treul 所说的 在一个文件系统中它为不同文件公用”
比如在ext3里面,
ext3_read_inode()里面有

inode->i_fop = &ext3_file_operations;

所以inode->i_fop已经是指向了ext3的文件操作函数集。
fops_get()增加其模块引用后返回的已经是指向ext3_file_operations的指针了。所以应该可以替换。

[ 本帖最后由 viton_xuan 于 2006-2-10 13:09 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

ITPUB技术栈

ITPUB技术栈是ITPUB企业打造的垂直于IT领域的知识社群平台,在这里,你既可以是创作者也可以是消费者。如果你的IT生涯丰富多彩,喷薄的个人价值尽可在小栈内体现;如果你渴望找到志同道合的伙伴,拓宽人脉,小栈比跑会场更快。 小栈特色:
1.极高的用户转化率,实现更直接的知识变现;
2.随时随地,刷个朋友圈的时间,实现更长效的信息沉淀;
3.戳痛、难点的专业咨询,更接近成功解决方案的时刻;
4.贴近意见领袖,个人高速成长,迈入更富有价值的人际圈。

----------------------------------------

技术小栈>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP