linux - 从 kprobe 获取参数未找到 regs->rdi x86_64

标签 linux kernel kprobe

我正在 Scientific Linux 6.3 x86_64 下编写内核模块,我希望使用 kprobes。在这个模块中,我需要在返回时访问函数的第一个参数,所以 jprobes 不可用。

我发现这篇非常有用的帖子:Getting function arguments using kprobes

但是,当我尝试在我的探测器中访问 regs->rdi 时,编译器会报错

error: ‘struct pt_regs’ has no member named ‘rdi’

在我的模块初始化期间,我毫无问题地运行了这个检查:

#ifndef CONFIG_X86_64
 printk(KERN_ALERT "Error: this module only supports x86_64!\n");
 return -EINVAL;
#endif

还有什么我应该看的吗? uname -r 返回 2.6.32-279.14.1.el6.x86_64.debug

这是一个 MWE:

#include <linux/module.h> 
#include <linux/kernel.h>
#include <linux/kprobes.h>
#include <linux/blkdev.h>

static int kprobe_test(struct kprobe *p, struct pt_regs *regs) {
  printk(KERN_INFO "rdi: %p\n", regs->rdi);
  return 0;
}

static struct kprobe myprobe = {
  .pre_handler = NULL,
  .post_handler = kprobe_test,
  .fault_handler = NULL,
  .addr = (kprobe_opcode_t *) generic_make_request,
};

int init_module(void) {
  register_kprobe(&myprobe);
  return 0;
}

void cleanup_module(void) {
  unregister_kprobe(&myprobe);
}

结果是:

...
/home/user/kmod/kprobe_64_mwe/kprobe_mwe.c:7: error: ‘struct pt_regs’ has no member named ‘rdi’
...

最佳答案

__KERNEL__ 被定义时,pt_reg 的定义发生改变。尝试改用 di

关于linux - 从 kprobe 获取参数未找到 regs->rdi x86_64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14221590/

相关文章:

c++ - 等待信号量的进程调度

c - 如何向内核 task_struct 添加一个字段?

linux-kernel - 从 Kprobe 处理程序打开/写入文件

linux - kprobe 处理程序未针对特定功能触发

linux - 如何将/kernel/sched/* 包含到 BPF 程序中?

linux - 如何配置 systemd 服务以定期重启?

python - 如何快速获取 dbus 上的所有 VLC 实例?

linux - 了解从 Perl 脚本转换为 Linux 的正则表达式

linux - 使用shell脚本将文件中的字符串替换为另一个具有特殊字符的字符串

linux - 引导加载程序(例如 grub、lilo...)如何找到内核镜像?