修改dyn_ftrace.flags 的 ENABLED、REGS_EN 位,并增加计数: schedule 函数的 dyn_ftrace.flags,使能了 ENABLED bit;yield 函数的 dyn_trace.flags,使能了 ENABLED、REGS_EN bit。 图4 将在boot 时修改的 nop 指令,分别修改成对 ftrace_caller 和 ftrace_regs_caller 的调用: 对于修改成对 ftrace_regs_caller...
调用关系 首先,被hook的内核函数入口指令call _mcount()被替换成ftrace_caller()/ftrace_regs_caller(),这里为第一级hook点。 2. ftrace_caller()/ftrace_regs_caller()函数内的call ftrace_stub被替换成ftrace_ops_no_ops()/ftrace_ops_list_ops(),这里是第二级hook点。 3. 最后,在ftrace_ops_no_ops(...
2、首先,被hook的func()入口桩call _mcount()被替换成ftrace_caller()/ftrace_regs_caller(),这里称为1级hook点。 3、下一步,ftrace_caller()/ftrace_regs_caller()函数内的call ftrace_stub被替换成ftrace_ops_no_ops()/ftrace_ops_list_ops(),这里称为2级hook点。 4、最后,在ftrace_ops_no_ops()/...
ENTRY(ftrace_regs_caller) ftrace_regs_entry 1 b ftrace_common ENDPROC(ftrace_regs_caller) ENTRY(ftrace_caller) ftrace_regs_entry 0 b ftrace_common ENDPROC(ftrace_caller) ENTRY(ftrace_common) sub x0, x30, #AARCH64_INSN_SIZE // ip (callsite's BL insn) mov x1, x9 // parent_ip (...
if (ftrace_ops_test(op, ip, regs)) op->func(ip, parent_ip, op, regs); } while_for_each_ftrace_op(op); …… } 3、4符号表的支持 这个其实相对比较简单,由链接器生成即可,运行时处理符号表代码在该文件中linux-3.12.6\kernel\kallsyms.c ...
3.3 nop、ftrace_regs_caller()/ftrace_caller() 是否真存在? 图12 crash状态查看 通过手动Kdump的方式生成安装两个补丁模块后的vmcore,然后通过Crash的方式打开,函数的开头会有5个字节的nop。当打上补丁后,旧函数的开头已经被替换,利用“call 函数”命令方式调用ftrace_regs_caller(),最终引导出新函数。
我们再次回到ftrace_graph_caller函数里面准备parent参数的地方。 mcount_get_lr_addr x0 // pointer to function's saved lr 看起来有点难懂,我们再次回到mcount_enter函数。 将X29(FP)与X30(LR)寄存器的内容压栈,然后当前的栈地址设置为当前函数的FP。
3 . 最终通过ftrace_modify_code来修改ftrace_graph_call原来所在位置的代码(步骤2中产生的跳转指令,这样可以直接跳转到ftrace_graph_caller这个函数) 所以我们可以看到,在使能ftrace function graph的时候,通过动态修改一条指令来跳转到我们想执行的函数上。在关闭的时候,通过将这条跳转指令恢复为nop指令。
但是内核也没有直接调用.ftrace_caller和.ftrace_regs_caller,而是在内存中构造了一个trampoline,将.ftrace_caller拷贝到这段trampoline中,并修改其中的相对偏移。 多个tracer同时工作 未完待续
From: Steven Rostedt <rost...@goodmis.org> Most architectures use pt_regs within ftrace_regs making a lot of the accessor functions just calls to the pt_regs internally. Instead of duplication this effort, use a HAVE_ARCH_FTRACE_REGS for architectures that have their own ftrace_regs that ...