Замена file_operations функцией «write» не имеет никакого эффекта? (Ядро 5.2.9) - PullRequest
0 голосов
/ 25 октября 2019

Я работаю над простым заданием для классов программирования ядра C, и мне нужно настроить канал связи с LKM. Я видел, как несколько человек успешно заменяли функцию write в структуре file_operations. Я не могу понять это правильно, несмотря на использование этого кода в качестве ссылки. Заменяющая версия для write не выполняется вообще. Обратите внимание, что я добавил простой глобальный счетчик для его отслеживания.

Я проанализировал адреса структур file_operations, и, похоже, он был заменен, как и ожидалось. Похоже, ничего не происходит, если я пытаюсь записать файл с echo 1 > file или в gedit.

Я работаю в ядре 5.2.9. Код ссылки был написан для более старых ядер (т.е. 4.4.0). Любая помощь будет оценена.

const static struct file_operations *fops_original = 0;
static struct file_operations fops_replacement;

static int counter = 0;

static ssize_t channel_write (struct file *f, const char __user * data, size_t sz, loff_t *l)
{
    pr_err("test");
    counter ++;
    return 1;
}

static int __init mod_init(void)
{
    struct file *fp;
    fp = filp_open("/root/Desktop/test", O_RDONLY, S_IRUSR);

    fops_original = (struct file_operations*)fp->f_op;

    fops_replacement = *fp->f_op;

    pr_err("The memory address of original f_ops is: %p\n", fp->f_op);

    fops_replacement.write = channel_write;

    pr_err("The memory address of replaced f_ops is: %p\n", (void *) &fops_replacement);

    fp->f_op = &fops_replacement;

    pr_err("The memory address of f_ops after replacement is: %p\n", fp->f_op);

    filp_close(fp, 0);

    return 0;
}

static void __exit mod_exit(void)
{
    struct file *fp;

    if(fops_original) {
        fp = filp_open("/root/Desktop/test", O_RDONLY, S_IRUSR);
        fp->f_op = fops_original;
        filp_close(fp, 0);
    }
    pr_err("Counter %d\n", counter);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...