在内核模块中写入文件 - 有fd,有指向写入sys调用的指针

时间:2013-11-21 15:00:59

标签: c linux-kernel kernel

我知道之前有这样的问题,但我希望能得到一些帮助。作为学术练习,我正在尝试从内核模块写入文件。我已将系统调用表中的原始写调用保存到typedef(sys_write_orig),并将其替换为我自己的函数。一切正常。

在我的新sys_write函数中,如果我使用sys_write_orig和从userland传入的原始缓冲区 - 它工作正常。但是当我尝试创建一个新缓冲区时 - 问题就开始了。我理解内核内存和用户内存的分离 - 但我认为有办法完成所有这些。有任何想法吗?这就是我想要做的事情:

char* kernbuf = "foo";
char __user* userbuf = (char*) kmalloc(3*sizeof(char), GFP_USER);

int n = copy_to_user(userbuf,kernbuf,3); 
printk("%d bytes copied to user space (I think).\n",n);

n = sys_write_orig(fd,userbuf,3);
printk("%d is the result from the write.\n",n);

我对核心土地有点新意。所以任何帮助都表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

我认为这样做了。我不想使用VFS,因为我有一个指向sys_write函数的指针(我用我自己的函数挂钩并保存了原始函数),所以我不妨使用它。但无论哪种方式 - 我都需要将内核空间数据放入用户空间。这似乎可以解决问题。感谢您将我回到VFS帖子 - 它有了解决这个问题的信息。

void append_file(unsigned int fd)
{
    // http://www.linuxjournal.com/node/8110/print
    mm_segment_t old_fs;
    old_fs = get_fs();
    set_fs(KERNEL_DS);

    sys_write_orig(fd, (char*)APPEND_TEXT, strlen(APPEND_TEXT));  

    set_fs(old_fs); 
    printk(KERN_INFO "Appended \"%s\" to fd:%d.\n", APPEND_TEXT, fd);
}