想请教一下LINUX利用VFS截获系统调用时的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想请教一下LINUX利用VFS截获系统调用时的问题相关的知识,希望对你有一定的参考价值。
代码如下:
char *root_fs = "file";
typedef ssize_t(*write_t)(struct file*, const char __user*,size_t,loff_t*);
write_t orig_root_write = NULL;
ssize_t mywrite(struct file* fp, const char __user* user, size_t t, loff_t* l)
ssize_t size;
printk("write\n");
size = orig_root_write(fp, user, t, l);
return size;
int patch_vfs(const char*p, write_t *orig_write, write_t new_write)
struct file *filep;
filep = filp_open(p, O_WRONLY, 0);
if (IS_ERR(filep))
return -1;
orig_write=filep->f_op->write;
struct file_operations *fop = filep->f_op;
fop->write = new_write;
filep->f_op = fop;
filp_close(filep, 0);
return 0;
int unpatch_vfs(const char *p, write_t orig_write)
struct file *filep;
filep = filp_open(p, O_RDONLY, 0);
if (IS_ERR(filep))
return -1;
struct file_operations *fop = filep->f_op;
fop->write = orig_write;
filep->f_op = fop;
filp_close(filep, 0);
return 0;
static int patch_init(void)
patch_vfs(root_fs, &orig_root_write, mywrite);
printk("<1>VFS is patched!\n");
return 0;
static void patch_cleanup(void)
unpatch_vfs(root_fs, orig_root_write);
printk("<2>VFS is unpatched!\n");
module_init(patch_init);
module_exit(patch_cleanup);
我现在的问题是每次insmod加载模块时就提示已杀死,我大概查了下原因这是代码问题,但是我这个是根据一个open的代码改写的,不知道错误在什么地方,请各位大神帮忙看下
你可以在各操作步骤前后加一些printk,来检测运行的过程,可能调用内核open的时候就已经失败了。
我对文件系统不太了解,希望能有点帮助。追问
恩,好的,还是谢谢您的回答,我还在继续找方法
(笔记)Linux内核学习之虚拟文件系统概念
虚拟文件系统
虚拟文件系统:内核子系统VFS,VFS是内核中文件系统的抽象层,为用户空间提供文件系统相关接口;
通过虚拟文件系统,程序可以利用标准Linux文件系统调用在不同的文件系统中进行交互和操作。
VFS作为抽象层:
文件系统被安装在一个特定的安装点上,该安装点在全局层次结构中被称作命名空间,
所有的已安装文件系统都作为根文件系统树的枝叶出现在系统中。
文件系统主要的对象:
超级块对象:代表一个已安装文件系统;struct super_block {}
索引节点对象:代表一个文件;struct inode {}
目录项对象:代表一个目录项,路径的一个组成部分;struct dentry {}
文件对象:进程打开的文件;struct file {}
特定文件系统类型:struct file_system_type {}
安装文件系统的实例:struct vfsmount {}
对象之间的结构关系如下:
Linux 中的 VFS 文件系统机制:
以上是关于想请教一下LINUX利用VFS截获系统调用时的问题的主要内容,如果未能解决你的问题,请参考以下文章