C 使用「__kprobes";它是如何工作的?
当提到Linux内核的内存模块时,有些函数我并不清楚。其中一个功能如下所示: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();
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指令(
用于x86)int3
- 添加一些包装器代码以保存上下文(寄存器等)
- 添加更多代码以帮助您访问函数参数或返回值
- 在给定地址插入断点CPU指令(
- 现在,当内核执行到达该探测地址时:
- 它将落入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