想请教一下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的代码改写的,不知道错误在什么地方,请各位大神帮忙看下

参考技术A 除了提示“已杀死”之外,就没有其他提示了么(dmesg),现在不知道是卡在哪一步了,如果内核检出异常,应该有提示。

你可以在各操作步骤前后加一些printk,来检测运行的过程,可能调用内核open的时候就已经失败了。

我对文件系统不太了解,希望能有点帮助。追问

恩,好的,还是谢谢您的回答,我还在继续找方法

(笔记)Linux内核学习之虚拟文件系统概念

虚拟文件系统

虚拟文件系统:内核子系统VFS,VFS是内核中文件系统的抽象层,为用户空间提供文件系统相关接口;

通过虚拟文件系统,程序可以利用标准Linux文件系统调用在不同的文件系统中进行交互和操作。

VFS作为抽象层:

 

    

 

文件系统被安装在一个特定的安装点上,该安装点在全局层次结构中被称作命名空间,

所有的已安装文件系统都作为根文件系统树的枝叶出现在系统中。

   

     

文件系统主要的对象:

超级块对象:代表一个已安装文件系统;struct super_block {}

索引节点对象:代表一个文件;struct inode {}

目录项对象:代表一个目录项,路径的一个组成部分;struct dentry {}

文件对象:进程打开的文件;struct file {}

特定文件系统类型:struct file_system_type {}

安装文件系统的实例:struct vfsmount {}

 

对象之间的结构关系如下:

    

 

Linux 中的 VFS 文件系统机制:

https://www.ibm.com/developerworks/cn/linux/l-vfs/

以上是关于想请教一下LINUX利用VFS截获系统调用时的问题的主要内容,如果未能解决你的问题,请参考以下文章

在Linux操作系统中如何截获系统调用

怎样截获linux内核导出的函数

linux文件系统体系结构 和 虚拟文件系统(VFS)

Linux文件管理

VFS(Virtual File System)

我想请教一下大家 在Linux系统上安装了Anaconda 后 怎么运行spyder???(请不要再复制粘贴了)