0

以下のコードで 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);

do_madvise() を調査しようとしました <sys_madvise のシステム コール関数を調査しようとしましたが、/proc/kallsyms を読み取って調査する正しい関数名が見つからなかったので、do_madvise を調査するようになりました。>

register_kprobe() は成功しましたが、アプリケーションがユーザー空間で madvise() を呼び出したときに、提供した kprobe ハンドラーからのカーネル ログがありません。kprobe ハンドラが呼び出されていないか、do_madvise() が適切にプローブされていないようです。

ありがとう、

4

0 に答える 0