【问题标题】:Dynamically creating variable in Kernel Module在内核模块中动态创建变量
【发布时间】:2015-03-06 14:56:41
【问题描述】:

我计划在我的内核模块中使用kthread_run API。
作为 kthread_run,返回一个 struct task_struct *,我想将它存储在我的模块中的一个全局变量中。
但是,我希望 cpu 每个线程都有一个线程,并且我使用 num_online_cpus 获得 CPU 数量。
但是,当我编写以下代码时:

    //outside init_module function
    int cpus = num_online_cpus();
    static struct task_struct *my_tasks[cpus];  

    static int __init init_module(){
           for(int j = 0; j < cpus; ++j){
                  my_tasks[j] = kthread_run(...);  
           }  
    }

但是,我收到以下错误:
错误:在文件范围内可变地修改了“任务”
我怎样才能做到这一点???

【问题讨论】:

  • 你的循环变量是j,但是数组下标是i?无论如何,使用kmalloc
  • 我认为问题在于声明*my_tasks[cpus]。当使用全局变量时,顺便说一句,这通常是一个不好的选择,数组的大小必须是编译时常量。
  • @Miline:这正是重点。但是我怎样才能将具有确切大小的数组声明为 num_of_cpus ?
  • 不要创建数组。创建项目的动态链表,每个节点为task_struct
  • @Vikas,您已经在下面找到了答案。试着把你的时间投入到你的问题上。

标签: linux-kernel kernel kernel-module


【解决方案1】:

如果您的变量实际上是每个 cpu 一个,您可能需要使用 per_cpu 宏。要点是,你声明这样一个变量:

DEFINE_PER_CPU(struct task_struct, my_tasks);

然后使用

访问变量
get_cpu_var(my_tasks).foo = bar;

您可以在 See http://www.makelinux.net/ldd3/chp-8-sect-5(或 percpu.h)获取更多信息以获取更多详细信息。

【讨论】:

  • 这很好,但在我的情况下不可用。我需要在主进程中一起访问所有变量,然后为每个变量创建线程。
  • 你可以使用per_cpu访问另一个cpu的变量。 (即:per_cpu(my_tasks, other_cpu).foo = bar)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多