c - linux 内核模块 : kernel method undefined (kthread_create_on_cpu)

标签 c linux linux-kernel driver kernel-module

方法

struct task_struct *kthread_create_on_cpu(int(*threadfn)(void *data),
    void *data, unsigned int cpu,
    const char *namefmt)

在 kthread.c 文件中定义,原型(prototype)在 kthread.h 中。但它没有导出。

在我的驱动程序中,我想在给定的 CPU 上启动一个 kthread,所以我这样做:

#include <linux/kthread.h>

int udpsrv_start_single( unsigned int cpu)
{
     DEBUG_PRINT_INFO( "[udpsrv] udpsrv_start: Initializing...\n");
     //(...)
     kthread->thread = kthread_create_on_cpu((void *)kthread_start_single, 
                                                      NULL, cpu, "mpsrv");
     //(...)

我可以编译,但在解析 MODPOST 上的模块符号时出现链接错误:

1>    LD [M]  /tmp/VisualKernel/mpsrvlkm.o
1>    Building modules, stage 2.
1>    MODPOST 1 modules
1>EXEC : warning : "kthread_create_on_cpu"[/tmp/VisualKernel/mpsrvlkm.ko] undefined!

我应该如何进行?如何导入此符号或改为做什么?

最佳答案

kthread_create_on_cpu 不是由内核导出的,它是 CPU 热插拔线程使用的内部函数(参见 linux/smpboot.h)。

我建议您改用kthread_bind

关于c - linux 内核模块 : kernel method undefined (kthread_create_on_cpu),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29129668/

相关文章:

linux - 如何重命名所有文件而不覆盖?

linux - 添加 DEFINE_WAIT 无法在 linux 模块中编译

multithreading - 在Linux中的内核线程之间进行通信

linux-kernel - 为什么CFS调度器使用红黑树?

C : Vec of structures

c - 存储固定范围 float 的有效方法

linux - 应用程序如何在运行时解析为不同版本的共享库?

Linux:多核 CPU 中的进程和线程

c - 程序卡住了,管道文件描述符何时不应该打开?

c - 如何让程序这样运行?