如何将数据传递给 kthread_run
Posted
技术标签:
【中文标题】如何将数据传递给 kthread_run【英文标题】:How to pass data to kthread_run 【发布时间】:2019-10-07 14:33:29 【问题描述】:我正在尝试使用多线程制作简单的内核模块。 所以我使用的是 linux/kthread.h,内核 v. 5.2.11
问题:我无法将 char 数组传递给线程:分段错误。
这就是我正在做的:
typedef struct
int num;
char origin[MAXSTR]; //part of input for current thread
struct completion wait_for_thread; //completion struct
kthread_arg;
然后:
struct task_struct *task;
static kthread_arg kta_first_thread;
kta_first_thread.num = 1;
strncpy(kta_first_thread.origin, dat1, MAXSTR );
//Here I have normal char array 'origin'
init_completion(&kta_first_thread.wait_for_thread);
task = kthread_run(&thread_function, (void*)&kta_first_thread, "one");
然后我有错误。此外,如果您从结构中删除数组,那么一切正常。 我确定做错了什么?
【问题讨论】:
“然后我就遇到了错误。” - 显示该错误。 您发布的代码看起来不错(假设dat1
有效)。
是的,dat1 是有效的。我的错误是分段错误,内核恐慌。我认为这是由于数组大小为 6.25 Mb (MAXSTR = 50000000)
你为什么不在堆上分配它?
在 stack 中分配 6MB 在任何情况下都不是一个好主意。如果您需要更详细的帮助,则需要在问题中提供更多详细信息。目前您只有一小段代码,它可能不会本身导致错误,并且“分段错误”错误会有所帮助。理想情况下,为了能够帮助您编写代码,我们需要 minimal reproducible example。
【参考方案1】:
传递给 kernel_run 的 args 必须是 kmalloced,您的 args 在堆栈中。我遇到了同样的问题,你的代码应该是这样的:
struct your_struct* test=NULL;
struct task_struct* t=NULL;
test=(struct your_struct*)kmalloc(sizeof(struct your_struct),GFP_KERNEL);
t=kthread_run(your_function,(void*)test,name);
【讨论】:
以上是关于如何将数据传递给 kthread_run的主要内容,如果未能解决你的问题,请参考以下文章