Linux kernel 在内核模块中动态创建变量

Linux kernel 在内核模块中动态创建变量,linux-kernel,kernel,kernel-module,Linux Kernel,Kernel,Kernel Module,我计划在我的内核模块中使用kthread\u runAPI。 当kthread_运行时,返回一个struct task_struct*,我想将其存储在模块中的全局变量中。 但是,我希望每个cpu都有一个线程,并且我使用num\u online\u cpu 但是,当我编写以下代码时: //outside init_module function int cpus = num_online_cpus(); static struct task_struct *my_tasks

我计划在我的内核模块中使用
kthread\u run
API。
当kthread_运行时,返回一个
struct task_struct*
,我想将其存储在模块中的全局变量中。
但是,我希望每个
cpu都有一个线程
,并且我使用
num\u online\u 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(...);  
           }  
    }
//外部初始化模块函数
int cpu=num_online_cpu();
静态结构任务\u结构*我的任务[CPU];
静态整数初始化模块(){
对于(int j=0;j
但是,我在这方面遇到了以下错误:
错误:在文件范围内可变地修改了“任务”

如何实现这一点?

如果您的变量实际上是每个cpu一个,那么您可能需要使用每个cpu宏。要点是,您可以通过以下方式声明此变量:

DEFINE_PER_CPU(struct task_struct, my_tasks);
然后使用

get_cpu_var(my_tasks).foo = bar;

有关更多详细信息,请访问See(或perpu.h)获取更多信息

循环变量是
j
,但数组下标是
i
?无论如何,使用
kmalloc
我认为问题在于声明
*myu任务[cpu]
。当使用全局变量时,顺便说一句,这通常是一个错误的选择,数组的大小必须是编译时常量。@Miline:这正是问题所在。但是我如何将数组的确切大小声明为CPU的num_呢?不要创建数组。创建项目的动态链接列表,每个节点都是
task\u struct
@Vikas,下面已经给出了答案。试着把你的时间花在你的问题上。这很好,但在我的情况下不可用。我需要在主进程中同时访问所有变量,然后为每个变量创建线程。您可以使用
per\u cpu
访问另一个cpu的变量。(即:
每个cpu(我的任务,其他cpu)。foo=bar
)。