3

Scientific Linux 6.3 x86_64 でカーネル モジュールを作成しており、kprobes の使用を検討しています。このモジュールでは、戻り時に関数の最初の引数にアクセスする必要があるため、jprobe は使用できません。

この非常に役立つ投稿を見つけました: 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’
...
4

1 に答える 1

4

が定義されると、 の定義がpt_reg変わります__KERNEL__di代わりに使用してみてください。

于 2013-01-08T18:57:16.243 に答える