gpt4 book ai didi

c - 使用 "__kprobes"以及它是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 02:06:46 36 4
gpt4 key购买 nike

在提到 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;
}
我对返回类型和函数名之间的“__kprobes”感到困惑。当我查看 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.) __attribute__((__section__(".kprobes.text"))) 的意义是什么? ?

2.) 在“function_name”之前使用它时,它在编译时和运行时做了什么?
我读到了 kprobe并发现它必须对断点和回溯做一些事情。我对 kprobe 的理解是它将帮助调试器创建回溯和断点。有人可以用简单的话解释一下它是如何工作的,如果我错了,请纠正我。

最佳答案

TL;博士

  • __attribute__((__section__(".kprobes.text")))将该函数放在 kprobes 无法找到的单独部分中,从而防止无限断点。
  • 您必须在“function_name”之前使用它来将整个“function_name”符号放在单独的部分中。

  • 真实答案
    kprobes (内核探针)是用于动态跟踪的 Linux 内核机制。它允许您在 处插入断点几乎所有 核函数,调用 您的 处理程序,然后继续执行。它通过运行时使用所谓的内核探针/kprobe 修补内核镜像来工作 - 请参阅 struct kprobe .这个探针将允许您将控制权传递给您的处理程序,并且该处理程序通常会进行一些跟踪。

    那么,引擎盖下发生了什么:
  • 你创建你的struct kprobe通过定义要中断的地址和处理程序来传递引用。
  • 您向 register_kprobe 注册您的探测器
  • 内核 kprobe 子系统从您的探针中找到地址
  • 然后kprobe:
  • 在给定地址
  • 处插入断点 CPU 指令( int 3 用于 x86)
  • 添加一些包装代码以保存上下文(寄存器等)
  • 添加更多代码以帮助您访问函数参数或返回值。
  • 现在,当内核执行到达探测到的地址时:
  • 会掉入 CPU 陷阱
  • 它将保存上下文
  • 它将通过 notifier_call_chain 将控制权传递给您的处理程序
  • ...
  • 毕竟它将恢复上下文

  • 这就是它的工作原理。正如你所看到的,这是一个非常整洁和肮脏的 hack,但是一些内核函数非常低级,以至于探测它们毫无意义。 notify_page_fault是这些功能之一 - 作为 notifier_call_chain 的一部分它用于将控制权传递给您的处理程序。

    因此,如果您在 notify_page_fault 上进行调查你会得到无限循环的断点,这不是你想要的。你真正想要的是保护这种功能,kprobes 通过将它放在单独的部分 .kprobes.text 中来做到这一点。 .这将阻止探测该函数,因为 kprobe 不会在该部分中查找地址。这是 __attribute__((__section__(".kprobes.text"))) 的工作.

    关于c - 使用 "__kprobes"以及它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24338052/

    36 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com