我知道之前有这样的问题,但我希望能得到一些帮助。作为学术练习,我正在尝试从内核模块写入文件。我已将系统调用表中的原始写调用保存到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);
我对核心土地有点新意。所以任何帮助都表示赞赏。谢谢!
答案 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);
}