Linux kernel 如何使用kprobe监视多个系统调用

Linux kernel 如何使用kprobe监视多个系统调用,linux-kernel,kernel,kernel-module,kprobe,Linux Kernel,Kernel,Kernel Module,Kprobe,所以我想监控多个系统调用mkdir、fork、write、open、pipe、read、rmdir等。我已经得到了一个kprobe解决方案,可以监控单个系统调用。我第一次尝试这样做是创建多个系统调用,如下所示: probe[0].symbol_name = "sys_mkdir"; probe[1].symbol_name = "sys_write"; int i; for(i = 0; i < 2; i++) { probe[i].pre_handler = sysmon_i

所以我想监控多个系统调用mkdir、fork、write、open、pipe、read、rmdir等。我已经得到了一个kprobe解决方案,可以监控单个系统调用。我第一次尝试这样做是创建多个系统调用,如下所示:

probe[0].symbol_name = "sys_mkdir";
probe[1].symbol_name = "sys_write";
int i;
for(i = 0; i < 2; i++)
{
    probe[i].pre_handler   = sysmon_intercept_before; /* called prior to function */
    probe[i].post_handler  = sysmon_intercept_after; /* called on function return */
    probe[i].fault_handler = sysmon_intercept_fault;
    if (register_kprobe(&probe[i]))
    {
        printk(KERN_ERR MODULE_NAME "register_kprobe failed\n");
        return -EFAULT;
    }
    printk(KERN_INFO MODULE_NAME "loaded probe: %d\n",i);
}
probe[0]。symbol\u name=“sys\u mkdir”;
探测[1]。symbol\u name=“sys\u write”;
int i;
对于(i=0;i<2;i++)
{
探测[i]。前置处理器=sysmon\u intercept\u before;/*在函数之前调用*/
探测[i]。在函数返回时调用post\u handler=sysmon\u intercept\u after;/*后*/
探测[i]。错误处理程序=系统命令拦截错误;
if(寄存器_kprobe(&probe[i]))
{
printk(内核错误模块名称“注册失败”\n);
返回-默认值;
}
printk(内核信息模块名称“加载的探测器:%d\n”,i);
}

这会使VM崩溃,所以现在我正在寻找另一种方法来监视多个系统调用。到目前为止,我唯一的想法就是分岔这个过程。我知道kprobe的工作原理是设置一个寄存器,然后检查该寄存器,所以我认为它早些时候崩溃的原因是多个kprobe实例试图写入单个寄存器。所以分叉似乎是可行的,因为每个系统调用监视器都有自己的内存空间(寄存器、堆、堆栈等)。任何想法都将不胜感激

还要看一看jprobes。在x86上,kprobes通常通过设置软件断点来工作,即用0xcc(int3指令)替换感兴趣的指令的第一个字节。假设您的kprobe第一次注册成功,第二次注册失败。如果卸载设置它们的内核模块,第一个kprobe设置的
int3
将保留,当它触发时,将导致未处理的异常和系统崩溃。你看到的是车祸吗?有没有提到“断点陷阱”?我建议先修复错误处理。另外,你在说什么寄存器?它是什么建筑?在x86上,kprobe不能以这种方式工作(请参阅我的上一篇评论)。我怀疑分岔一些过程会有所帮助。让我们首先了解系统崩溃的原因以及kprobe注册失败的原因。如果你能展示你的内核模块的完整代码,你就会更容易理解如何使它工作。Eugene你如何处理第一条评论中的异常?