从Linux内核驱动程序写入文件失败

时间:2011-07-14 16:09:36

标签: c linux-kernel

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>

static int __init hello_start(void)
{
    struct file* my_fd;

    my_fd = filp_open ("/tmp/foobar", O_WRONLY | O_APPEND, 0);
    if (IS_ERR (my_fd))
    {
    printk (KERN_ERR "Failed to open file. err: %d.\n", my_fd);
    }
    else
    {
    my_fd->f_op->write (my_fd, "some data", 10, &my_fd->f_pos);
    }

printk(KERN_INFO "Loading hello module...\n");
return 0;
}

static void __exit hello_end(void)
{
printk(KERN_INFO "hello_end.\n");
}

module_init(hello_start);
module_exit(hello_end);

上面的代码在文件中写入时给出错误-14。我在这做错了什么?

以下是dmesg输出:

[19551.674999] Write returned: -14.
[19551.675004] Loading hello module...

2 个答案:

答案 0 :(得分:5)

write的{​​{1}}成员(struct file_operations)声明如下:

include/linux/fs.h

请注意第二个参数上的 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 标记,它告诉您它正在等待用户空间指针。当你像从内核那样调用它时,你传递的是一个内核空间指针;因此你的记忆有缺陷。

@ ShinTakezou链接到“acct.c”代码是你想要看的;特别是,调用__user欺骗内核使用自己的数据段作为“用户”数据段。

答案 1 :(得分:2)

首先,请勿忽略警告:%dmy_fd不利。

然后,我认为从内核进行文件I / O通常不是一个好主意,除非是“特殊”情况。

我尝试过O_CREAT,一切都很好,除非文件已经存在。其他一切(尤其是O_WRONLY | O_APPEND)都没有给我机会。

我认为,为了使用户空间中的“as as”内核文件I / O需要知道更多内容,而且可能有点棘手(或“危险”)。

但请尝试查看acct.c代码。