【发布时间】: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