在参考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 的理解是它可帮助调试器创建回溯和断点。请问能否用简单的语言解释一下它的工作原理,并纠正我的错误认识。