Я написал простую программу для переноса значения через командную строку в мой драйвер. Я использовал module_param()
для этого и дал аргумент разрешения, т.е. третий аргумент module_param()
, как S_IWUSR. Полагаю, это позволит пользователю изменять значение этого параметра после загрузки драйвера в ядро. Я попытался изменить значение этого параметра следующим образом:
echo 1 > /sys/module/ghost/parameters/num
Но это показывает мне Ошибка «Отказано в доступе» каждый раз, когда я пытаюсь сделать это, даже когда я выполняю команду с sudo
. Я также попытался изменить разрешение в module_param()
на 0770
, но все еще не смог изменить значение параметра. Есть ли способ изменить значение параметра, передаваемого при вставке драйвера? Почему приведенная выше команда показывает, что разрешение отклонено, даже если я запускаюсь как sudo?
После ответа @Ian Abott я должен изменить значение параметра. Теперь я попытался определить функцию обратного вызова, чтобы уведомлять меня о любых изменениях значения этого параметра во время загрузки моего драйвера. Вот код
#include"headers.h"
#include"declarations.h"
static int my_set(const char *val, const struct kernel_param *kp)
{
int n = 0, ret;
ret = kstrtoint(val,10,&n); // Kernel function to convert string to integer
if (ret !=0 || n > 10) {
return -EINVAL;
}
printk(KERN_ALERT "my-set function running\n");
return param_set_int(val,kp);
}
static const struct kernel_param_ops param_ops = {
.set = my_set,
.get = param_get_int,
};
module_param(num,int,0600);
static char *name = "hello";
module_param(name,charp,0770);
static int __init init_func(void)
{
int i;
module_param_cb(callBack, ¶m_ops, &num, 0770);
printk(KERN_INFO "Value of num is %d\n",num);
for( i=0; i<num; i++)
{
printk(KERN_INFO "%s\n", name);
}
return 0;
}
static void __exit exit_func(void)
{
printk(KERN_INFO "Value of num is %d\n",num);
printk(KERN_ALERT "Module removed successfully\n");
}
module_init(init_func);
module_exit(exit_func);
Но, похоже, он не работает, потому что функция my_set никогда не запускается, даже если я изменяю значение. Я сомневаюсь,
1) Это правильный способ реализации функции обратного вызова для параметра?
2) Каково значение первого аргумента для функции module_param_cb?