Как изменить значение параметра module_param в драйвере устройства? - PullRequest
0 голосов
/ 28 января 2020

Я написал простую программу для переноса значения через командную строку в мой драйвер. Я использовал 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, &param_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?

...