Я работаю над простым заданием для классов программирования ядра 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);
}