Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用「__kprobes";它是如何工作的?_C_Linux Kernel - Fatal编程技术网

C 使用「__kprobes";它是如何工作的?

C 使用「__kprobes";它是如何工作的?,c,linux-kernel,C,Linux Kernel,当提到Linux内核的内存模块时,有些函数我并不清楚。其中一个功能如下所示: static inline int __kprobes notify_page_fault(struct pt_regs *regs) { int ret = 0; /* kprobe_running() needs smp_processor_id() */ if (kprobes_built_in() && !user_mode_vm(regs)) { preempt_disable();

当提到Linux内核的内存模块时,有些函数我并不清楚。其中一个功能如下所示:

static inline int __kprobes notify_page_fault(struct pt_regs *regs)
{
int ret = 0;

/* kprobe_running() needs smp_processor_id() */
if (kprobes_built_in() && !user_mode_vm(regs)) {
    preempt_disable();
    if (kprobe_running() && kprobe_fault_handler(regs, 14))
        ret = 1;
    preempt_enable();
}

return ret;
} 
我对返回类型和函数名之间的“\uuukprobes”感到困惑。当我查看compiler.h中“_kprobes”的初始化时,我发现如下:

/*Ignore/forbid kprobes attach on very low level functions marked by 
this attribute:*/
#ifdef CONFIG_KPROBES
# define __kprobes  __attribute__((__section__(".kprobes.text")))
#else
# define __kprobes
#endif
我知道在编译时,kprobe将被它定义的部分替换

问题: 1.《代码》\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

2.)当它在“function_name”之前使用时,它在编译时和运行时做什么

我读到了,发现它必须对断点和回溯跟踪做些什么。我对kprobe的理解是,它将帮助调试器创建回溯跟踪和断点。有人能用简单的语言解释一下它到底是如何工作的,如果我错了,请纠正我。

TL;博士
  • \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(.kprobes.text))
    将把该函数放
  • 您必须在“函数名称”之前使用它,以将整个“函数名称”符号放置在单独的部分中
  • 真实答案
    kprobes
    (内核探测)是用于动态跟踪的Linux内核机制。它允许您在几乎任何内核函数处插入断点,调用您的处理程序,然后继续执行。它通过运行时使用所谓的kernelprobe/kprobe修补内核映像来工作-请参阅。此探测将允许您将控制传递给处理程序,该处理程序通常会执行一些跟踪

    那么,引擎盖下面发生了什么:

    • 通过定义要中断的地址和传递引用的处理程序,可以创建
      结构kprobe
    • 您可以使用
      register\u kprobe
    • 内核kprobe子系统从探测器中查找地址
    • 然后kprobe:
      • 在给定地址插入断点CPU指令(
        int3
        用于x86)
      • 添加一些包装器代码以保存上下文(寄存器等)
      • 添加更多代码以帮助您访问函数参数或返回值
    • 现在,当内核执行到达该探测地址时:
      • 它将落入CPU陷阱
      • 它将保存上下文
      • 它将通过
        notifier\u call\u chain
      • 毕竟,它将恢复上下文
    这就是它的工作原理。正如您所看到的,这是一个非常整洁和肮脏的黑客行为,但是一些内核函数的级别非常低,所以对它们进行探测是毫无意义的
    notify\u page\u fault
    是这些函数之一,作为
    notifyer\u call\u链的一部分
    用于将控制权传递给处理程序

    因此,如果您在
    notify\u page\u fault
    处进行探测,您将得到无限个断点循环,这不是您想要的。您真正想要的是保护此类函数,而kprobe通过将其放在单独的部分
    .kprobes.text
    来实现这一点。这将阻止在该函数处进行探测,因为kprobe不会在该节中查找地址。这是
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu