2012-11-18 28 views
0

我想insmod一個的JProbe模塊,一個植根Android手機:爲什麼我在嘗試insmod內核模塊探測do_fork時遇到-38錯誤?

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

/* 
    * Jumper probe for do_fork. 
    * Mirror principle enables access to arguments of the probed routine 
    * from the probe handler. 
    */ 

/* Proxy routine having the same arguments as actual do_fork() routine */ 
static long jdo_fork(unsigned long clone_flags, unsigned long stack_start, 
       struct pt_regs *regs, unsigned long stack_size, 
       int __user *parent_tidptr, int __user *child_tidptr) 
{ 
     printk(KERN_INFO "jprobe: clone_flags = 0x%lx, stack_size = 0x%lx," 
         " regs = 0x%p\n", 
       clone_flags, stack_size, regs); 

     /* Always end with a call to jprobe_return(). */ 
     jprobe_return(); 
     return 0; 
} 

static struct jprobe my_jprobe = { 
     .entry     = jdo_fork, 
     .kp = { 
       .symbol_name = "do_fork", 
     }, 
}; 

static int __init jprobe_init(void) 
{ 
     int ret; 

     ret = register_jprobe(&my_jprobe); 
     if (ret < 0) { 
       printk(KERN_INFO "register_jprobe failed, returned %d\n", ret); 
       return -1; 
     } 
     printk(KERN_INFO "Planted jprobe at %p, handler addr %p\n", 
       my_jprobe.kp.addr, my_jprobe.entry); 
     return 0; 
} 

static void __exit jprobe_exit(void) 
{ 
     unregister_jprobe(&my_jprobe); 
     printk(KERN_INFO "jprobe at %p unregistered\n", my_jprobe.kp.addr); 
} 

module_init(jprobe_init) 
module_exit(jprobe_exit) 
MODULE_LICENSE("GPL"); 

但失敗:

[email protected]:# insmod my_jprobe.ko 
    [3223.32]register_jprobe failed, returned -38 

我得到-38錯誤,無法理解什麼是呢,只有當我看到的失敗返回值是-22,是否有可能在基於arm的芯片上insmod jprobe模塊?

do_fork位於System.map中,位於對象表中。

我需要在配置文件中打開哪些標記才能支持jpobes

+1

如果我是正確的假設'register_jprobe'返回標準錯誤代碼,-38指ENOSYS或「功能未實現」。 – tangrs

+0

@tangrs,你是對的register_jprobe和register_kprobe不在system.map中。我如何添加它們? – 0x90

回答

1

如果您的System.map中沒有register_probe或register_kprobe,那意味着您的當前內核配置中未啓用CONFIG_KPROBES。

您需要爲啓用它的平臺構建內核,然後嘗試您的模塊。

1
CONFIG_OPTPROBES=y 
CONFIG_PREEMPT=y 
CONFIG_OPTPROBES=y 
CONFIG_MODULE_UNLOAD=y 
CONFIG_MODULES=y 
CONFIG_KALLSYMS=y 
CONFIG_KALLSYMS_ALL=y 
CONFIG_DEBUG_INFO=y 

還有一配置的標誌,我需要具體到我的平臺:

CONFIG_MODULE_FORCE_LOAD=y 

http://www.kernel.org/doc/Documentation/kprobes.txt

相關問題