Ошибка записи файла из драйвера ядра Linux - PullRequest
2 голосов
/ 14 июля 2011
#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 ]

5 голосов
/ 14 июля 2011

write член struct file_operationsinclude/linux/fs.h) объявлен так:

 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

Обратите внимание на маркер __user во втором аргументе, который говорит вам, что он ожидает user-space указатель.Когда вы называете это так, как вы это делали из ядра, вы передаете указатель kernel-space ;отсюда ваша ошибка памяти.

@ Ссылка ShinTakezou на код "acct.c" - это то, на что вы хотите посмотреть;в частности, вызовы set_fs заставляют ядро ​​использовать собственный сегмент данных в качестве сегмента данных «пользователя».

2 голосов
/ 14 июля 2011

Во-первых, не игнорируйте предупреждения: ваш %d не подходит для my_fd.

Тогда, я думаю, что в общем случае нецелесообразно выполнять файловый ввод-вывод из ядра, за исключением "особых" случаев.

Я пробовал с O_CREAT, и все в порядке, кроме случаев, когда файл уже существует. Все остальное (в частности O_WRONLY | O_APPEND) не дало мне никаких шансов.

Я считаю, что для того, чтобы сделать файловый ввод / вывод в ядре "as" в пространстве пользователя, необходимо знать больше вещей, и это, вероятно, немного сложно (или "опасно").

Однако попробуйте взглянуть на acct.c код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...