Linux kernel 无法在Linux-5.8.18中对内核函数进行kprobe

Linux kernel 无法在Linux-5.8.18中对内核函数进行kprobe,linux-kernel,kprobe,Linux Kernel,Kprobe,我刚刚用以下代码检查了Linux-5.8.18中的kprobe,但它似乎没有按预期工作 #include <linux/kernel.h> #include <linux/module.h> #include <linux/sched.h> #include <linux/mm.h> #include <linux/kprobes.h> #include <linux/init.h> #include <linux/v

我刚刚用以下代码检查了Linux-5.8.18中的kprobe,但它似乎没有按预期工作

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/kprobes.h>
#include <linux/init.h>
#include <linux/version.h>

MODULE_DESCRIPTION("kprobe test");
MODULE_LICENSE("GPL");

int kprobe_handler(struct kprobe *p, struct pt_regs *reg) //long start, size_t len_in, int bhv)
{
        printk("XXXXXXXXXXXX Being called by %d\n", current->pid);
        return 0;
}

static void handler_post(struct kprobe *p, struct pt_regs *regs, unsigned long flags)
{
        printk("XXXXXXXXXXXX Being called\n");
        return;
}
static struct kprobe kprobe_entry = {
        .pre_handler    = kprobe_handler,
        .post_handler   = handler_post,
        .symbol_name    = "do_madvise",
};

static int __init kprobe_test_init(void)
{
        int ret;

        ret = register_kprobe(&kprobe_entry);
        if (ret < 0) {
                return ret;
        }
        printk("Initializing kprobe, KP.addr %px\n", kprobe_entry.addr);
        return 0;
}

static void __exit kprobe_test_exit(void)
{
        unregister_kprobe(&kprobe_entry);
        printk("Finalizing kprobe\n");
}

module_init(kprobe_test_init);
module_exit(kprobe_test_exit);
#包括
#包括
#包括
#包括
#包括
#包括
#包括
模块描述(“kprobe测试”);
模块许可证(“GPL”);
int-kprobe\u处理程序(结构kprobe*p,结构pt\u regs*reg)//长启动,大小长度,int-bhv)
{
printk(“XXXXXXXXXX被%d\n调用”,当前->pid);
返回0;
}
静态void handler_post(结构kprobe*p、结构pt_regs*regs、无符号长标志)
{
printk(“XXXXXXXXXX被称为\n”);
返回;
}
静态结构kprobe kprobe\u项={
.pre_handler=kprobe_handler,
.post\u handler=handler\u post,
.symbol_name=“do_madvise”,
};
静态整数初始化kprobe测试初始化(void)
{
int ret;
ret=登记表(登记表条目和登记表条目);
如果(ret<0){
返回ret;
}
printk(“初始化kprobe,KP.addr%px\n”,kprobe\u entry.addr);
返回0;
}
静态无效uu退出kprobe\u测试u退出(无效)
{
取消注册\u kprobe(&kprobe\u条目);
printk(“完成kprobe\n”);
}
模块初始化(kprobe测试初始化);
模块退出(kprobe测试退出);
我试着去调查do_madvise()

register_kprobe()成功,但当用户空间中有一个名为madvise()的应用程序时,我提供的kprobe处理程序中没有内核日志。似乎没有调用kprobe处理程序,或者没有正确探测do_madvise()

谢谢