C 为什么__跟踪点“U调度开关”;是未定义的

C 为什么__跟踪点“U调度开关”;是未定义的,c,linux,linux-kernel,kernel,kernel-module,C,Linux,Linux Kernel,Kernel,Kernel Module,我想从这个答案编译和加载模块 有一些错误:我包括了,因为它是调度时钟所需要的,我在无效*忽略后传递了参数bool ignr,因为它是(un)寄存器跟踪调度开关所需要的。因此,现在我的代码正在编译,但是make中有一条警告: 警告:“\u跟踪点\u调度开关”[/some\u path/myclock.ko]未定义 当我尝试insmod时,出现了一个错误: insmod:错误:无法在模块中插入模块myclock.ko:未知符号 那么,我必须做些什么才能让它起作用呢 UPD:我现在拥有的全部代码 #i

我想从这个答案编译和加载模块 有一些错误:我包括了
,因为它是
调度时钟所需要的,我在
无效*忽略
后传递了参数
bool ignr
,因为它是
(un)寄存器跟踪调度开关所需要的。因此,现在我的代码正在编译,但是
make
中有一条警告:

警告:“\u跟踪点\u调度开关”[/some\u path/myclock.ko]未定义

当我尝试insmod时,出现了一个错误:

insmod:错误:无法在模块中插入模块myclock.ko:未知符号

那么,我必须做些什么才能让它起作用呢

UPD:我现在拥有的全部代码

#include <linux/sched/clock.h>
#include <linux/sched.h>
#include <linux/module.h>
#include <linux/printk.h>
#include <linux/types.h>
#include <linux/tracepoint.h>
#include <trace/events/sched.h>


MODULE_LICENSE("GPL");
MODULE_AUTHOR("somebody");


void my_sched_switch_probe(void* ignore, bool ignr, struct task_struct* prev, struct task_struct* next) {
    printk("my_sched_switch_probe: %s -> %s at %lu\n", prev->comm, next->comm,
    (unsigned long) sched_clock());
}


int cswtracer_init(void) {
    register_trace_sched_switch(my_sched_switch_probe, 0);
    return 0;
}


void cswtracer_fini(void) {
    unregister_trace_sched_switch(my_sched_switch_probe, 0);
}


module_init(cswtracer_init);
module_exit(cswtracer_fini);
也许我的Makefile是错误的,有一种方法可以通过使用Makefile中的某个选项来使用uu跟踪点_sched_开关?这是:

ifneq ($(KERNELRELEASE),)
    obj-m := myclock.o
else
    CURRENT = $(shell uname -r)
    KDIR = /lib/modules/$(CURRENT)/build
    PWD = $(shell pwd)
default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
    rm *.o
    rm *.mod.c
    rm *.symvers
    rm *.order
    rm .cache.mk
    rm .*.*.cmd
    rm -r .tmp_versions
endif

在内核中,符号
\uuu跟踪点\u sched\u开关()
的导出方式如下:

EXPORT_TRACEPOINT_SYMBOL_GPL(sched_switch);
MODULE_LICENSE("GPL");
这意味着,仅允许GPL代码访问此符号。您必须声明您的模块许可证与GPL兼容,如下所示:

EXPORT_TRACEPOINT_SYMBOL_GPL(sched_switch);
MODULE_LICENSE("GPL");

在此之后,您的代码应该编译并链接到内核,而不会出现警告/错误。

我已经有了一行
MODULE_许可证(“GPL”)所以这对我没有帮助:(@好吧,那么如果你展示一个MCVE而不是让我们猜测你的代码,也许会有帮助;)你使用哪个内核版本?Ubuntu18.04上的4.15.0-45