如何将数据传递给 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的主要内容,如果未能解决你的问题,请参考以下文章

Primeng - 对话服务将数据传递给对话组件

Android:如何将数据传递给子活动?

每次调用都将数据传递给 WCF

Qt C++ - 如何成功地将数据传递给子进程?

如何将数据传递给嵌套控制器(UIContainerView)?

SwiftUI 如何将数据传递给 ObservedObject 函数